Дважды щелкните неправильное поведение на jtable - PullRequest
0 голосов
/ 07 февраля 2020

Добрый день!

У меня есть jTable, я заполняю его слушателем JButton. после заполнения jTable двойным щелчком мыши я вызываю JOptionPane.showMessageDialog. После этого проблема накапливается. После повторного нажатия кнопки JButton jTable снова заполняется. И если я дважды нажму на строку \ ячейка снова, он покажет мне 2 сообщения от JOptionPane вместо одного. Как я понимаю, мне нужно обновить sh модель, но у меня ничего не получилось.

Мой код:

Форма. java

    btnExec = new JButton("Exec");
    table = new JTable();
    scrollPane.setViewportView(table);
    // Create Button Listener
    ActionListener startProcess = new ExecButtonPressed();
    btnExec.addActionListener(startProcess);

ExecButtonPressed. java

public class ExecButtonPressed implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
            try {
                System.out.println("table rows:" + Form.table.getRowCount());
                DefaultTableModel tableModel = new DefaultTableModel();
                prepare(tableModel); // create headers
                fill(tableModel);   // add rows

                Form.table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                Form.table.setModel(tableModel);

                sortresize(Form.table); //resize width of columns + sort by id desc
                Form.table.setDefaultEditor(Object.class, null);


                DoubleClicker.whattodo(); // class of double-click behavior logic


            }catch (Exception e1) {
                e1.printStackTrace();
            }

    }

//
    private void prepare(DefaultTableModel tableModel) throws Exception {
        try {
            tableModel.addColumn("id");
            tableModel.addColumn("name");
            tableModel.addColumn("age");
        }catch (Exception e1) {
            e1.printStackTrace();
        }
    }


//
    private void fill(DefaultTableModel tableModel) {
        Object [] line = {"01", "Qw" , "20"};
        tableModel.addRow(line);
        Object [] line2 = {"02", "As" , "21"};
        tableModel.addRow(line2);
        Object [] line3 = {"03", "Zx" , "22"};
        tableModel.addRow(line3);
    }

//
    private void sortresize(JTable table) {
        //Resize width
        for (int column = 0; column < table.getColumnCount(); column++) {
            TableColumn tableColumn = table.getColumnModel().getColumn(column);
            if (column  == 0) {
                tableColumn.setPreferredWidth( 45 ); 
            } else if (column   == 1){
                tableColumn.setPreferredWidth( 50 ); 
            } else if (column   == 2){
                tableColumn.setPreferredWidth( 55 ); 
            } 
        }


        //Sort table.
        if (table.getRowCount() > 1){
            TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
            table.setRowSorter(sorter);
            List<RowSorter.SortKey> sortKeys = new ArrayList<>();

            int columnIndexToSort = 0;
            sortKeys.add(new RowSorter.SortKey(columnIndexToSort, SortOrder.DESCENDING));

            sorter.setSortKeys(sortKeys);
            sorter.sort();
        };

    }

//  

}

DoubleClicker. java

public class DoubleClicker {

    public static void whattodo() {
        Form.table.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent mouseEvent)  {
                try {
                    System.out.println("click:" + mouseEvent.getClickCount());
                    Form.table = (JTable) mouseEvent.getSource();
                    Point point = mouseEvent.getPoint();
                    int row = Form.table.rowAtPoint(point);
                    int columnid = Form.table.columnAtPoint(point);

                    Form.table.convertRowIndexToModel(row);
                    Form.table.convertColumnIndexToModel(columnid);

                    if (mouseEvent.getClickCount() == 2 && Form.table.getSelectedRow() != -1) {
                        if (Form.table.getColumnName(columnid).equalsIgnoreCase("name")) {
                            JOptionPane.showMessageDialog(null, 
                              (String) Form.table.getValueAt(row,columnid), "Selected name", 1);
                        }
                    }

                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        });
    }
}

Я пробовал разные варианты, например

tableModel.setRowCount(0); 
tableModel.getDataVector().removeAllElements(); 
tableModel.fireTableDataChanged();

Может быть, я поставил его в неправильном месте? потому что каждый щелчок мыши регистрируется дважды при втором нажатии кнопки.


Обновление: я добавил

System.out.println("table rows:" + Form.table.getRowCount());

сразу после публикации c void actionPerformed (ActionEvent e) {и, как я вижу в консоли, Form.table.getRowCount () == 3 после выполнения второй кнопки. Также, как я вижу, добавлено

System.out.println("click:" + mouseEvent.getClickCount());

в качестве первой строки publi c void mousePressed (MouseEvent mouseEvent), после того, как 2-е нажатие кнопки в каждом клике по таблице выполняется дважды, которое я получил: click: 1 click : 1 при первом выполнении это просто щелчок: 1

Похоже, что одно представление за другим.

всей формы. java на случай, если кто-то будет щедрым на компиляцию

    public class Form {

    private JFrame frame;
    public static JTable table;
    public static JButton btnExec;
    public static JScrollPane scrollPane;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Form window = new Form();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Form() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        btnExec = new JButton("Exec");
        btnExec.setBounds(10, 11, 89, 23);
        frame.getContentPane().add(btnExec);

        scrollPane = new JScrollPane();
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setBounds(10, 45, 369, 174);
        frame.getContentPane().add(scrollPane);

        table = new JTable();
        scrollPane.setViewportView(table);


        // Create Button Listener
        ActionListener startProcess = new ExecButtonPressed();
        btnExec.addActionListener(startProcess);




    }
}

1 Ответ

0 голосов
/ 09 февраля 2020

Получил ответ на форуме coderanch, решил отправить его туда. возможно, кому-то это понадобится в будущем.

Решение заключается в добавлении MouseListener, который необходимо добавить в таблицу при создании таблицы (а не в методе actionPerformed () класса ActionListener).

, поэтому я перевёл DoubleClicker.whattodo(); // class of double-click behavior logic из ExecButtonPressed. java в форму. java:

table = new JTable();
scrollPane.setViewportView(Form.table);
DoubleClicker.whattodo(); // class of double-click behavior logic
...