gpt4 book ai didi

java - JTable 未正确返回所选行

转载 作者:行者123 更新时间:2023-11-29 07:23:00 24 4
gpt4 key购买 nike

我正在使用 DefaultTableModel 的扩展,如下所示:

这是更新后的新 AchievementTableModel 以反射(reflect)一些答案的输入。

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() 值时,在使用第一个选择中的 model.replace(cells) 调用更改表数据后,我总是得到 -1,即使我重新选择第一个 JComboBox 选项。有没有我失踪的原因?我应该更改一些代码吗?

编辑:为了回答这个问题,代码发生了很大变化,所以这里是更新后的代码。上面是新的 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);

最佳答案

调用 replace 后,不应使用新的 JTable 重新初始化表。 fireTableDataChanged() 方法将提醒您现有的表它应该重新绘制。正在发生的事情是您正在查看放入面板中的表,但是您正在将变量更改为 JTable 的不同实例。当您查询那个新的但不可见的表时,它会为您提供 -1 用于选定的行数。如果您编辑您的帖子以显示该代码区域中正在发生的事情,这可能会有所帮助。

第二次编辑:

而不是这个:

  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);

改为这样做:

 if(model==null) {
model = new AchievementTableModel(cells, columns);
} else {
model.setDataVector(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);

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);
} else {
table.setModel(model);
}

您不需要将表格添加到新的滚动 Pane 并在每次模型更改时将其重新添加到面板。

关于java - JTable 未正确返回所选行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1046089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com