java - 更改表格模型后编辑 JTable 单元格错误
问题描述
我有一个列表,单击删除时会删除该表并创建一个具有新值的新表。在这个函数中,我为表模型设置了 RowCount(0),这会导致 model.addTableModelListener 出现问题,当获取选定的列时,它会输出 -1 而不是列。
public void SetList() {
list.setModel(dlm);
ClassesPanel.remove(list);
dlm.removeAllElements();
if(Classes != null)
{
for(int i = 0; i < Classes.length; i++) {
dlm.addElement(Classes[i]);
}
}else {System.out.print("we null"); }
//dlm.addElement("none");
list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent arg0) {
try {
if (!arg0.getValueIsAdjusting()) {
if(list.getSelectedValue().toString() != null) {
SelectedTab = list.getSelectedValue().toString();
}
try {
/// THIS IS WHERE I CREATE A NEW JTABLE /////
csvToArray(SelectedTab);
scrollPane_table.remove(table);
model.setRowCount(0);
table.setModel(model);
scrollPane_table.repaint();
table.repaint();
SetTable();
model.fireTableDataChanged();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
此代码运行良好,但我遇到问题的部分是在为新表设置值的末尾。
public void SetTable() {
table = new JTable(model);
Object[] columnsName = new Object[columnsNumber1];
columnsName[0] = "Name";
for(int i = 1; i < columnsNumber1; i++) {
if(Assignments[i] != null)
columnsName[i] = Assignments[i].toString();
}
Object[] rowData = new Object[columnsNumber1];
model.setColumnIdentifiers(columnsName);
if(Students != null) {
for(int i = 0; i < StudentList.size(); i++){
rowData[0] = Students[i];
for( int j = 1; j < columnsNumber1; j++)
{
System.out.println(columnsNumber1+" Number of col");
rowData[j] = Grades[j-1];
}
model.addRow(rowData);
}
}
table.setModel(model);
scrollPane_table.add(table);
//This works before selecting another item on the list but not after.
model.addTableModelListener(new TableModelListener() {
int selectedRowIndex = table.getEditingRow();;
public void tableChanged(TableModelEvent e) {
System.out.println("something changed at "+ table.getSelectedColumn()+table.getColumnName(table.getSelectedColumn()));
}
});
}
我不知道为什么这会出错,因为我在设置列表函数中重置了模型。
解决方案
不要创建新的 JTable。
您需要做的就是使用:
model.setRowCount(0);
这将从模型中删除所有数据。
TableModelListener 仍将添加到模型中,因此您也不需要重置它。
在该方法中您需要做的settable()
就是使用 addRow(...) 方法将数据添加到模型中。
或者,如果表的结构正在发生变化(即您有不同的列),那么您将:
- 创建一个新的 TableModel 并将其添加到表中。
- 将 TableModelListener 添加到 TableModel
就是这样,仍然不需要创建新的 JTable。
scrollPane_table.remove(table);
scrollPane_table.add(table)
摆脱上面的代码。永远不要尝试从 JScrollPane 添加/删除组件。组件被添加到JViewport
JScrollPane 中。如果您需要替换视口中的组件,则只需使用:
scrollPane.setViewportView(...);
编辑:
因此,您需要创建一个简单的示例,其中包含一个包含 JTable 的 JFrame 和一个带有 ActionListener 的 JButton 来更改表的模型。
所以基本代码是这样的:
table = new JTable( new DefaultTableModel(3, 5) );
frame.add(new JScrollPane(table), BorderLayout.CENTER);
JButton button = new JButton("Change Model");
frame.add(button, BorderLayout.PAGE_END);
button.addActionListener( new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
table.setModel( new DefaultTableModel(3, 7) );
}
});
推荐阅读
- java - 在 mvc 中使用 Spring 5 调度程序
- dialogflow-es - Webhook 请求中的 Dialogflow API V2“对话结束”标志
- javascript - Node JS 在一个页面上使用多个注册助手
- javascript - 使用 scale(0) 而不是 display: none 的下拉菜单
- react-native - 反应原生链接挂在“资产已成功链接到您的项目”
- kubernetes - Kubernetes DNS 不解析外部地址
- javascript - Javascript - 游戏侧碰撞(从下到上)
- javascript - AJAX 获取请求不起作用
- java - 放基于字体大小的高度?
- mysql - 如果mysql表不存在则创建,否则添加缺少的列?