Проблемы, когда фильтр поиска и событие mouseClicked используются в JTable - PullRequest
0 голосов
/ 05 февраля 2020

В этом коде приводится JTable данных сотрудника с помощью SearchFilter. С помощью mouseClick в столбцах «Обработка сотрудников» и «Обработанный сотрудником» он должен быть направлен на URL-адрес, связанный с сотрудником в текущей строке. Код ниже работает правильно, за исключением случаев, когда используется поисковый фильтр. Когда я использую фильтр поиска и щелкаю мышью по отфильтрованной строке, он направляется на URL-адрес, относящийся к сведениям о сотруднике в первой строке JTable, вместо текущей отфильтрованной строки сведений о сотруднике. Может ли кто-нибудь помочь мне с этим.

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);
            }
    }

1 Ответ

1 голос
/ 05 февраля 2020
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);

При использовании сортировщика / фильтра для таблицы данные не сортируются / не удаляются из TableModel. Вы видите только отсортированное / отфильтрованное представление данных. Поэтому у вас больше нет взаимно-однозначного сопоставления «строки таблицы» и «строки модели».

Поэтому вам необходимо получить доступ к данным, используя методы JTable:

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

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '' '' '' '' '' '' '' 'JTable' автоматически преобразует индексы строк / столбцов, чтобы сопоставить их с соответствующими данными в "* 1011". you.

Прочтите API JTable, вы найдете 4 convert???(...) методы, которые преобразуют индексы строк / столбцов между моделью и представлением, если вам когда-нибудь понадобится выполнить это преобразование вручную.

Вам также нужно будет исправить другие места, где вы пытаетесь получить доступ к данным с TableModel.

...