java - 设置为监听单元格选择事件的 Jtable 不会触发事件

标签 java swing jtable selectionmodel

当我们从同一行中选择时,设置为监听单元格选择事件的 JTable 不会生成事件,如果我选择除所选单元格以外的其他行,Jtable 会触发事件。

这是代码... 例如,当我选择单元格“row0 col0”,然后尝试选择同一行中的任何其他单元格时,jtable 不会触发任何事件, 为了触发“第 0 列第 1 行”单元格上的事件,我必须选择第 2 行中的任何单元格,并且必须单击“第 0 列第 1 列”单元格

public class test_jtable_event extends javax.swing.JFrame {

    /** Creates new form test_jtable_event */
    public test_jtable_event() {
       initComponents();
    }



// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jTable1.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {"row 0 column1", "row 0column 2", "row 0 column 3", "row 0column4"},
            {"row 1 column 0", "row 1 column 2", "row 1 column 2", "row 1 column 2"},
            {null, null, null, null},
            {null, null, null, null}
        },
        new String [] {
            "Title 1", "Title 2", "Title 3", "Title 4"
        }
    ));
    jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener()
        {
            public void valueChanged(ListSelectionEvent e)
            {
                System.out.println(e.getSource());
                System.out.println(jTable1.getSelectedColumn());
                System.out.println(jTable1.getSelectedRow());
            }

        });
        jTable1.setCellSelectionEnabled(true);
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(13, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(25, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

public static void main(String args[]) {

    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(test_jtable_event.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(test_jtable_event.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(test_jtable_event.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(test_jtable_event.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {

            new test_jtable_event().setVisible(true);
        }
    });
}
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
// End of variables declaration
}

最佳答案

行列选择由不同的选择模型控制:

  • 行:table.getSelectionModel()
  • 列:table.getColumnModel().getSelectionModel()

你必须同时注册你的监听器

关于java - 设置为监听单元格选择事件的 Jtable 不会触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8849343/

相关文章:

java - Borderlayout gui 添加到边框

java - ActionPerformed 自执行

java - 为什么 ActionEvent.getActionCommand() 返回 null?

java - 如何让JTable像windows一样调整大小?

java - 带有自定义单元格渲染器的 JList 与 Jtable

java - Apache POI 是否可以为 Microsoft Word 添加/删除水印

java - Gmail 的密码下一步按钮

java - 如何让IntelliJ IDEA的每次自动弹出Documentation?

java - 调用 JTable.setModel() 的先前模型行为

java - 恢复应用程序时应用程序崩溃