【问题标题】:Why there is no response after I clicked in a JTable cell?为什么单击 JTable 单元格后没有响应?
【发布时间】:2022-01-05 23:09:21
【问题描述】:

我有以下示例 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. 如何判断我点击的是鼠标左键还是鼠标右键?

【问题讨论】:

  • “如果我点击同一行,它不会响应:12 -> 13 或 21 -> 23” - 这不清楚。什么是“同一行”?
  • 添加了更多细节。
  • JTable 不是电子表格。您可以编写 JTable 代码,使其类似于电子表格,但需要大量自定义代码。 Stack Overflow 答案的自定义代码太多。

标签: java swing jtable listselectionlistener


【解决方案1】:

问题是,JTableListSelectionModel 仅管理行选择,来自 JavaDocs

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

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

相反,您可能想使用TableColumnModel 使用的ListSelectionModel,例如...

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

【讨论】:

  • 但是使用“table.getColumnModel()”,如果我点击 11,然后点击 31 [同一列],它不会响应?如果你在现有代码中/之后添加“table.getColumnModel()”,那么它会响应行和列的变化,所以如果我先点击“12”然后点击“33”,它会输出“33 " 两次 [第一个来自行更改,第二个来自 col 更改?
  • @Frank 请花时间通读How to Write a List Selection Listener,以更好地了解ListSelectionListeners 的工作原理以及为什么您会收到两个事件
  • 感谢您的评论,我已经查看了它以及 TableListSelectionDemo,我想知道是否有解决我的问题的方法:每次我如何在单元格中输出值 [仅一次]单击与上次单击的单元格相同的行或相同列的任何单元格?
猜你喜欢
  • 2011-12-07
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2013-03-14
  • 2013-04-03
相关资源
最近更新 更多