双击jtable的错误行为

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

美好的一天!

我有一个jTable,我由JButton侦听器填充它。在通过鼠标双击填充jTable之后,我调用JOptionPane.showMessageDialog。之后,该问题被指责。再次单击JButton后,将再次填充jTable。如果我再次双击row \ cell,它将显示JOptionPane的2条消息,而不是一条。据我了解,我需要刷新模型,但没有成功。

我的代码:

Form.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());

在公共无效actionPerformed(ActionEvent e)之后{正如我在控制台中看到的,第二个按钮执行后,Form.table.getRowCount()== 3。还添加了

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

作为public void mousePressed(MouseEvent mouseEvent)的第一行正如我所看到的,在每次单击表中的第二个按钮执行两次之后我有 :点击数:1点击数:1第一次执行时,只需点击:1

似乎有一个接一个的视图。

整个Form.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);




    }
}

美好的一天!我有一个jTable,我正在通过JButton侦听器填充它。在通过鼠标双击填充jTable之后,我调用JOptionPane.showMessageDialog。之后,该问题被指责。单击后...

java jtable actionlistener double-click
1个回答
0
投票

在coderanch论坛上得到了答案,决定在那里提交。也许将来有人会需要它。

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