Действие ListSelectionListener запущено, но JDialog отображается после 2-го щелчка - PullRequest
1 голос
/ 19 марта 2020

Я хочу открыть 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, emailAddress=enim.sit.amet@sedlibero.edu, 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, emailAddress=nisi.sem@orcilobortis.ca, joinDate=2018-06-18]

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

Спасибо.

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

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

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

1 Ответ

2 голосов
/ 19 марта 2020

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

По сути, вам просто нужно создать слушателя и затем установить его на вашу таблицу с помощью 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();
    }
}
...