DefaultTableModelの拡張機能を次のように使用しています。
これは、いくつかの回答からの入力を反映するように更新した後の新しいAchievementTableModelです。
public AchievementTableModel(Object[][] c, Object[] co) {
super(c,co);
}
public boolean isCellEditable(int r, int c) {return false;}
public void replace(Object[][] c, Object[] co) {
setDataVector(convertToVector(c), convertToVector(co));
fireTableDataChanged();
}
私のGUIは、次のプロパティを持つJTableです。
if(table==null)
table = new JTable(model);
else
table.setModel(model);
table.setFillsViewportHeight(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
table.getTableHeader().setReorderingAllowed(false);
table.getTableHeader().setResizingAllowed(false);
table.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
table.getColumnModel().setColumnSelectionAllowed(false);
表示するデータを選択するJComboBoxがあります。TableModelは、model.replace(cells)を呼び出すことで更新され、上記のテーブル作成コードを再度実行します。
GUI JTableで行を選択し、table.getSelectedRow()値を出力すると、最初のJComboBoxを再選択した場合でも、最初の選択からmodel.replace(cells)呼び出しでテーブルデータを変更した後、常に-1が返されます。オプション。私が行方不明になっている理由はありますか?コードを変更する必要がありますか?
編集:コードはこの質問に答えようとすることで大きく変わったので、ここに更新されたコードがあります。新しいAchievementTableModelは上にあります。
これにより、モデルとテーブルが正しく表示され、ScrollPaneに表示されるように設定されます。
if(model==null)
model = new AchievementTableModel(cells, columns);
else
model.replace(cells, columns);
if(table==null) {
table = new JTable(model);
table.setFillsViewportHeight(true);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
table.getColumnModel().setColumnSelectionAllowed(false);
table.getTableHeader().setResizingAllowed(false);
} else
table.setModel(model);
column = table.getColumn(columns[0]);
column.setPreferredWidth(25);
column = table.getColumn(columns[1]);
column.setPreferredWidth(225);
column = table.getColumn(columns[2]);
column.setPreferredWidth(40);
table.doLayout();
add(new JScrollPane(table), BorderLayout.CENTER);