我有一个列表,当单击删除时删除表并创建一个带有新值的新表。在此函数中,我为表模型设置了setRowCount(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()));
}
});
}
我不知道为什么这会因为我在设置列表功能中重置模型而出错。
答案 0 :(得分:0)
不要创建新的JTable。
您需要做的就是使用:
model.setRowCount(0);
这将删除模型中的所有数据。
TableModelListener仍将添加到模型中,因此您无需重置它。
您需要在settable()
方法中使用addRow(...)方法将数据添加到模型中。
或者如果表的结构正在改变(即你有不同的列),那么你会:
就是这样,仍然没有必要创建一个新的JTable。
scrollPane_table.remove(table);
scrollPane_table.add(table)
摆脱上面的代码。不要尝试在JScrollPane中添加/删除组件。组件将添加到JScrollPane的JViewport
。如果您需要替换视口中的组件,则只需使用:
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) );
}
});