Действие ListSelectionListener запускается, но JDialog отображается после второго щелчка

Я хочу открыть JDialog (CustomerUpdateDialog) после нажатия строки JTable (часть JDialog, называемой: CustomerListDialog) только один раз, однако для открытия CustomerUpdateDialog требуется два щелчка.

Вот код для JTable:

public class CustomerListDialog extends JDialog {

private void initComponents(ArrayList<Customer> customers) {

    ...

    ListSelectionListener listener = new ListSelectionListener() {

        @Override
        public void valueChanged(ListSelectionEvent e) {
            try {
                SimpleDateFormat format = new SimpleDateFormat("MMM dd yyyy");

                Date date = format.parse (tbl_Settings.getValueAt(tbl_Settings.getSelectedRow(), 8).toString());
                LocalDate joinDate = Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();

                Customer customer = new Customer.Builder(Validator.Id(tbl_Settings.getValueAt(tbl_Settings.getSelectedRow(), 0).toString()),
                        tbl_Settings.getValueAt(tbl_Settings.getSelectedRow(), 1).toString(),
                        tbl_Settings.getValueAt(tbl_Settings.getSelectedRow(), 2).toString(),
                        tbl_Settings.getValueAt(tbl_Settings.getSelectedRow(), 6).toString()) //
                                .streetName(tbl_Settings.getValueAt(tbl_Settings.getSelectedRow(), 3).toString()) //
                                .city(tbl_Settings.getValueAt(tbl_Settings.getSelectedRow(), 4).toString()) //
                                .postalCode(tbl_Settings.getValueAt(tbl_Settings.getSelectedRow(), 5).toString()) //
                                .emailAddress(Validator.Email(tbl_Settings.getValueAt(tbl_Settings.getSelectedRow(), 7).toString()))
                                .joinDate(joinDate)//
                                .build();

                System.out.println(customer.toString());
                System.out.println(e.toString());

                CustomerUpdateDialog customerUpdateDialog = new CustomerUpdateDialog(customer);
                customerUpdateDialog.setDefaultCloseOperation(CustomerUpdateDialog.DISPOSE_ON_CLOSE);
                customerUpdateDialog.setVisible(true);

            }
            catch (ApplicationException | ParseException e1) {
                System.out.println(e1.getMessage());
            }

        }
    };

    tbl_Settings.getSelectionModel().addListSelectionListener(listener);
}

private JTable createTable(ArrayList<Customer> customers) {

    String[] columnNames = "Customer ID,First Name,Last Name,Street Name,City,Postal Code,Phone Number,Email Address,Join Date".split(",");

    int rows = customers.size();
    int cols = columnNames.length;
    String[][] data = new String[rows][cols];

    for(Customer customer : customers) {
        int i = customers.indexOf(customer);
        for(int j=0; j<cols; j++) {
            String cellData = null;
            switch (j) {
                case 0:
                    cellData = String.valueOf(customer.getId());
                    break;
                case 1:
                    cellData = customer.getFirstName();
                    break;
                case 2:
                    cellData = customer.getLastName();
                    break;
                case 3:
                    cellData = customer.getStreetName();
                    break;
                case 4:
                    cellData = customer.getCity();
                    break;
                case 5:
                    cellData = customer.getPostalCode();
                    break;
                case 6:
                    cellData = customer.getPhoneNumber();
                    break;
                case 7:
                    cellData = customer.getEmailAddress();
                    break;
                case 8:
                    cellData = customer.getJoinDateString();
            }
         data[i][j] = cellData;
         } 
    }

    JTable table = new JTable(data, columnNames);

    return table;
}

public CustomerListDialog(ArrayList<Customer> customers) {
    setBounds(100, 100, 1000, 500);
    initComponents(customers);
}

}

и вот код, в котором я добавляю диалоговое окно JTable в главное меню:

JMenuItem mntmCustomersList = new JMenuItem("List");
    mnCustomers.add(mntmCustomersList);
    mntmCustomersList.setHorizontalAlignment(SwingConstants.LEFT);
    mntmCustomersList.setContentAreaFilled(false);
    mntmCustomersList.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            CustomerListDialog dialog = new CustomerListDialog(customerList);
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        }
    });

Примерный список данных клиента:

Customer [id=1739, firstName=Kaitlin, lastName=Oneil, streetName=P.O. Box 329, 9608 Tortor Road, city=Diegem, postalCode=64447, phoneNumber=834-890-3976, [email protected], joinDate=2014-04-12]
Customer [id=2210, firstName=Octavius, lastName=Joseph, streetName=Ap #342-9819 Quis St., city=San Leucio del Sannio, postalCode=55477-429, phoneNumber=671-872-7563, [email protected], joinDate=2018-06-18]

Почему мне нужно дважды щелкнуть строку, чтобы открыть другое диалоговое окно?

Спасибо.

* ОБНОВЛЕНИЕ *

Я изменил обработчик события MouseListener на ListSelectionListener в соответствии с комментарием @AndrewThompson и ответом @Lunatic0, но все равно получаю тот же результат.

Я обнаружил, что я щелкаю по таблице, затем я могу щелкнуть любое другое приложение на своем компьютере, и тогда появится диалоговое окно.


person SJCypher    schedule 19.03.2020    source источник
comment
1) Чтобы быстрее помочь, изменить, чтобы добавить минимальный воспроизводимый пример или Короткий, автономный, правильный пример. Данные жесткого кода для таблицы. Для простоты использования используйте только основные макеты J2SE. 2) Предпочитайте композицию наследованию. В данном случае это означает использование стандартных диалогов, а не пользовательских. 3) Для JTable используйте более специализированный ListSelectionListener, а не прослушиватель мыши.   -  person Andrew Thompson    schedule 19.03.2020
comment
Спасибо @AndrewThompson, я пытался использовать ListSelectionListener, но все равно получаю тот же результат. Не уверен, что происходит.   -  person SJCypher    schedule 19.03.2020


Ответы (1)


Вы можете протестировать этот фрагмент и адаптировать его к ситуации диалога.

По сути, вам просто нужно создать прослушиватель, а затем установить его в свою таблицу, используя getSelectionModel().addListSelectionListener(listener)

Кроме того, поместите таблицу в JFrame вместо JDialog, я точно не знаю, почему, но, кажется, правильно работает только с JFrame.

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class TableExample {
    JFrame f;

    TableExample() {
        f = new JFrame();

        String data[][] = { { "101", "Amit", "670000" }, { "102", "Jai", "780000" }, { "101", "Sachin", "700000" } };
        String column[] = { "ID", "NAME", "SALARY" };
        JTable jt = new JTable(data, column);
        jt.setBounds(30, 40, 200, 300);
        JScrollPane sp = new JScrollPane(jt);
        f.add(sp);
        f.setSize(300, 400);
        f.setVisible(true);

        ListSelectionListener listener = new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                JOptionPane.showInputDialog("Hello");
                System.out.println(jt.getValueAt(jt.getSelectedRow(), 0).toString());

            }
        };

        jt.getSelectionModel().addListSelectionListener(listener);

    }

    public static void main(String[] args) {
        new TableExample();
    }
}
person Zenb0t    schedule 19.03.2020
comment
Возможно, вы захотите попробовать поместить этот JFrame внутрь JDialog, не проверяли, но можете сработать, если вам действительно нужно использовать диалог. - person Zenb0t; 19.03.2020