代码之家  ›  专栏  ›  技术社区  ›  Frank

为什么在JTable单元格中单击后没有响应?

  •  0
  • Frank  · 技术社区  · 4 年前

    我有以下Java Swing示例 JTable 应用程序:

    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.ListSelectionModel;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    
    public class JTableListSelectionListener
    {
      public static void main(String[] a)
      {
        JFrame frame=new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        final JTable table;
    
        String[] columnTitles={"A","B","C","D"};
        Object[][] rowData={{"11","12","13","14"},{"21","22","23","24"},{"31","32","33","34"},{"41","42","43","44"}};
    
        table=new JTable(rowData,columnTitles);
    
        table.setCellSelectionEnabled(true);
        ListSelectionModel cellSelectionModel=table.getSelectionModel();
        cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    
        cellSelectionModel.addListSelectionListener(new ListSelectionListener()
        {
          public void valueChanged(ListSelectionEvent e)
          {
            String selectedData=null;
    
            int[] selectedRow=table.getSelectedRows();
            int[] selectedColumns=table.getSelectedColumns();
    
            for (int i=0;i<selectedRow.length;i++)
              for (int j=0;j<selectedColumns.length;j++)
                selectedData=(String)table.getValueAt(selectedRow[i],selectedColumns[j]);
            System.out.println("Selected: "+selectedData);
          }
    
        });
    
        frame.add(new JScrollPane(table));
        frame.setLocationRelativeTo(null);
        frame.setSize(300,200);
        frame.setVisible(true);
      }
    }
    

    如果我单击同一行,它不会响应:
    如果我点击“12”,然后点击“13”,或者先点击“21”,然后再点击“23”,为什么?

    1. 如何修复它,使无论我按哪个顺序单击哪里,它都将始终输出该单元格中的值?

    2. 如何判断我是用鼠标左键还是用鼠标右键点击了?

    0 回复  |  直到 4 年前
        1
  •  0
  •   MadProgrammer    4 年前

    问题是 ListSelectionModel 对于 JTable 仅管理行选择,从 JavaDocs

    返回用于维护行选择状态的ListSelectionModel。

    这意味着行选择不会更改,您不会收到通知。

    相反,您可能希望使用 列表选择模型 由使用 TableColumnModel 例如

    table.getColumnModel().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent e) {
            System.out.println("Selected column");
        }
    });