我在选择 JTable 实例上的行时遇到问题。
这就是我想要的:
我想要两个相等的表,行中的数据相同。当您在第一个表上选择一行时,例如第三行,我还希望自动选择第二个表上的第三行。我已经通过向 JTable 添加一个ListSelectionListener
来解决这个问题,该 JTable 更新了一个只保存所选值的类。然后该类使用第一个选定的值触发另一个 JTable。
我的问题是:
当用户对其中一张表上的行进行排序时,就会出现我的问题。然后视图会发生变化,但模型中的底层对象不会发生变化,它们的顺序与以前相同。
假设我启动应用程序时表格如下所示:
Column_1_header_in_table_1 Column_1_header_in_table_2
Peter Peter
John John
Steve Steve
在选择第一行时table 1
(即Peter),则应选择包含Peter的行,该行table 2
也是第一行。
但是,如果我按下列标题table 1
以便对列进行排序,那么该表的视图将变为:
Column_1_header_in_table_1 Column_1_header_in_table_2
John Peter
Steve John
Peter Steve
现在,如果我选择第一行table 1
(即 John),table 2
则将选择第一行(即 Peter)。table 1
但我希望在上选择与 in 同名的行table 2
,即第 2 行table 2
。
有什么方法可以用来解决这个问题吗?
编辑
好的,我将尝试用我在没有编辑器的情况下编写的以下代码来描述我的解决方案,所以我可能包含一些错误。但我只想从概念上展示它现在是如何工作的。首先,我完成了 MyTable 实现的这个接口:
public interface TableUpdater {
public void updateTable(int age);
}
PersonHolder 类只保存最后选择的值,并在从第一个选择新值时触发另一个表。
public class PersonHolder {
private static int age;
private List<TableUpdater> tables = new ArrayList<>();
public static void subscribe(TableUpdater table){
tables.add(table);
}
public static void setValue(int value){
age = value;
for(TableUpdater table : tables) {
table.updateTable(age);
}
}
public static int getValue(){
return age;
}
}
然后我们有表本身:
public class MyTable extends JTable implements TableUpdater {
public MyTable {
table.getSelectionModel().addListSelectionListener(new MySelectionListener());
PersonHolder.subscribe(this);
}
...
@Override
public void updateTable(int age) {
this.getSelectionModel().setSelectionInterval(age, age);
}
private class MySelectionListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
Person p = (Person)getValueAt(e.getLastIndex(), 0);
PersonHolder.setValue(p.getAge());
}
}
}