Java 单击行/列时,ListSelectionEvent fire 2异步触发

Java 单击行/列时,ListSelectionEvent fire 2异步触发,java,swing,event-handling,jtable,listselectionlistener,Java,Swing,Event Handling,Jtable,Listselectionlistener,单击行/列时,ListSelectionEvent fire 2异步触发 我应该改变我的代码吗 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.ListSel

单击行/列时,ListSelectionEvent fire 2异步触发

我应该改变我的代码吗

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", "44", "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.setSize(300, 200);
frame.setVisible(true);
}

}
import javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.ListSelectionModel;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
公共类JTableListSelectionListener{
公共静态void main(字符串[]a){
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
最终JTable表;
字符串[]columnTitles={“A”、“B”、“C”、“D”};
对象[][]行数据={{“11”、“12”、“13”、“14”}、{“21”、“22”、“23”、“24”},
{ "31", "32", "33", "34" }, { "41", "42", "44", "44" } };
表=新的JTable(行数据、列标题);
table.setCellSelectionEnabled(真);
ListSelectionModel cellSelectionModel=table.getSelectionModel();
cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
cellSelectionModel.addListSelectionListener(新建ListSelectionListener()){
public void值已更改(ListSelectionEvent e){
字符串selectedData=null;
int[]selectedRow=table.getSelectedRows();
int[]selectedColumns=table.getSelectedColumns();
for(int i=0;i
输出将是

入选人数:42

入选人数:42

入选人数:33

入选人数:33

但我想在用户单击特定行或列时触发单个事件?

用于检查它是否(正在更改)

返回这是否是一系列仍在进行更改的多个事件中的一个。有关如何使用此选项的详细信息,请参阅
ListSelectionModel.setValueIsAdjusting(boolean)
的文档

根据Andrew Thompson的建议添加了getValueIsAdjusting(),并将更新代码

cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
  public void valueChanged(ListSelectionEvent e) {

    if(e.getValueIsAdjusting()) {
        return;
    }
    ..