在JTable中使用搜索过滤器和mouseClicked事件时发生的问题

问题描述 投票:0回答:1

此代码为Employee Details JTable提供SearchFilter。用鼠标单击“雇员处理”和“雇员处理”列时,应将其定向到当前行中与雇员相关的URL。下面的代码正常工作,但使用搜索过滤器除外。当我使用搜索过滤器并在已过滤的行上单击鼠标时,它会指向JTable第一行中与员工详细信息相关的URL,而不是指向当前已过滤行的员工详细信息。有人可以帮我这个忙。

package Test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.BevelBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import EmployeeDAO;
import EmployeeDTO;
import common.UIConstants;

public class EmpDataWin extends JFrame {

    private static final String EMPLOYEE_NAME = "Employee Name";
    private static final String DEPARTMENT = "Department";
    private static final String DETAILS = "Details";
    private static final String EMPLOYEE_PROCESSING = "Employee Processing";
    private static final String EMPLOYEE_PROCESSED = "Employee Processed";

    private final int DETAILS_COLUMN_INDEX = 2;
    private final int EMPLOYEE_PROCESSING_COLUMN_INDEX = 3;
    private final int EMPLOYEE_PROCESSED_COLUMN_INDEX = 4;

    DefaultTableModel model = new DefaultTableModel();
    Container cont = this.getContentPane();
    JTable tab = new JTable(model);
    private TableRowSorter<TableModel> rowSorter = new TableRowSorter<>(model);
    private final JTextField searchFilter = new JTextField();

    public EmpDataWin(List<EmployeeDTO> pEmployeeDTO) {
        initialize(pEmployeeDTO);
    }

    public void initialize(List<EmployeeDTO> pEmployeeDTOList) {

        JPanel panelParent = new JPanel(new BorderLayout());

        // Add Header

        model.addColumn(EMPLOYEE_NAME);
        model.addColumn(DEPARTMENT);
        model.addColumn(DETAILS);
        model.addColumn(EMPLOYEE_PROCESSING);
        model.addColumn(EMPLOYEE_PROCESSED);


        // Add data row to table

        for (EmployeeDTO aEmployeeDTO : pEmployeeDTOList) {
            model.addRow(new Object[] { aEmployeeDTO.getEmployee_Name(), aEmployeeDTO.getDepartment(),
                    aEmployeeDTO.getDetails(), aEmployeeDTO.getEmployee_Processing(),
                    aEmployeeDTO.getEmployee_Processed()
            });
        }

        tab.setRowSorter(rowSorter);
        tab.setAutoCreateRowSorter(true);


        JPanel panel = new JPanel(new BorderLayout());
        panel.add(new JLabel(UIConstants.SEARCH), BorderLayout.WEST);
        JTextField searchFilter = SearchFilter.createRowFilter(tab);
        panel.add(searchFilter, BorderLayout.CENTER);
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));



        tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        // Mouse listener part
        tab.addMouseListener(new MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent e) {
                int col = tab.getSelectedColumn();
                int row = tab.getSelectedRow();

                // Employee Processing columnindex is
                if (EMPLOYEE_PROCESSING_COLUMN_INDEX == col) {
                    String employeeName = (String) tab.getModel().getValueAt(row, col);

                    System.out.println("employeeName = " + employeeName);
                    if (employeeName != null && !employeeName.trim().equals("")) {
                        OpenURL open = new OpenURL();
                        open.openEmployeeProcessing(employeeName);
                    } else {
                        System.out.println("ERROR : Invalid Client name ....");

                    }else if(EMPLOYEE_PROCESSED_COLUMN_INDEX == col) {

                        String employeeName = (String) tab.getModel().getValueAt(row, col);

                        System.out.println("employeeName = " + employeeName);
                        if (employeeName != null && !employeeName.trim().equals("")) {
                            OpenURL open = new OpenURL();
                            open.openEmployeeProcessed(employeeName);
                        } else {
                            System.out.println("ERROR : Invalid Client name ....");


                        } else if (DETAILS_COLUMN_INDEX == col) {

                            String CD = (String) tab.getModel().getValueAt(row, col);
                            OpenDrive od = new OpenDrive();
                            osd.openDetails(CD);
                        }
                    }
                });


        tab.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        JScrollPane sp = new JScrollPane(tab,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        panelParent.add(panel,BorderLayout.NORTH);
        panelParent.add(sp,BorderLayout.CENTER);
        panelParent.setBorder(BorderFactory.createEmptyBorder(10 , 10, 10, 10));
        cont.add(panelParent);
        this.pack();

            }

            public static void main(String[] args) {

                EmployeeDAO dao = new EmployeeDAO();
                List<EmployeeDTO> dto = dao.getemployeeData();

                JFrame frame = new EmpDataWin(dto);
                frame.setTitle("Employee Data");
                frame.setLocationRelativeTo(null);
                frame.setSize(1200, 600);
                frame.setVisible(true);
            }
    }
java swing awt tablerowsorter rowsorter
1个回答
1
投票
当您在桌上使用分类器/过滤器时,数据不会从TableModel中分类/删除。您只会看到数据的排序/过滤视图。因此,您不再具有“表行”和“模型行”的一对一映射。
因此您需要使用JTable的方法访问数据:

//String employeeName = (String) tab.getModel().getValueAt(row, col); String employeeName = (String) tab.getValueAt(row, col);

getValueAt(...)JTable方法将自动转换行/列索引以映射到TableModel中的适当数据,然后将为您调用getValueAt(...)TableModel方法。] >

阅读JTable API,您将发现4 convert???(...)方法,这些方法将在您需要手动进行此转换的情况下在模型和视图之间转换行/列索引。

您还需要修复尝试从TableModel访问数据的其他位置。

© www.soinside.com 2019 - 2024. All rights reserved.