JTableインスタンスの行の選択に問題があります。
これが私が
やりたいことです。行に同じデータを持つ2つの等しいテーブルが必要です。最初のテーブルの行、たとえば3番目の行を選択するとき、2番目のテーブルの3番目の行も自動的に選択されるようにします。ListSelectionListener
選択した値を保持するだけのクラスを更新するをJTableに追加することで、これを解決しました。次に、そのクラスは、最初から選択された値で他のJTableをトリガーします。
私の問題は次
のとおりです。
ユーザーがテーブルの1つで行を並べ替えると、問題が発生します。次に、ビューは変更されますが、モデル内の基になるオブジェクトは変更されません。これは、以前と同じ順序です。
アプリケーションを起動すると、テーブルが次のようになっているとしましょう。
Column_1_header_in_table_1 Column_1_header_in_table_2
Peter Peter
John John
Steve Steve
(Peterである)の最初の行を選択するとき、table 1
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
(つまり、ジョン)を選択すると、の最初の行table 2
(つまり、ピーター)が選択されます。ただし、で同じ名前の行をtable 1
選択する必要があります。table 2
これは、の行2table 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());
}
}
}