我可能不明白 fireTableStructureChanged() 方法的工作原理。我假设如果我调用该方法,则会调用实现的方法 getColumnCount()、getRows() 和 getValueAt(int row, int col),以便我的具有指定模型的表发生变化。
这是我的表模型
public class MyTableModel extends AbstractTableModel{
JComboBox box;
public MyTableModel(JComboBox choice){
super();
box = choice;
}
public void updateTable(){
this.fireTableStructureChanged();
}
@Override
public int getColumnCount() {
//implemented
}
@Override
public int getRowCount() {
//implemented
}
@Override
public Object getValueAt(int row, int col) {
//implemented
}
choice5 是一个 JComboBox
table1 = new JTable(new MyTableModel(choice5));
当您从choice5中选择一个项目时
((MyTableModel)table1.getModel()).updateTable();
被调用(编辑:对于我可以选择的每个项目,我可能有一个不同的 jtable 我想显示)
会发生什么:我检查了 getColumnCount() 和 getRowCount() 确实被调用,但 getValueAt(...) 不是。尽管两种方法都返回(即)值 1,但 JTable 表 1(由于 0 行和 0 列而未显示)仍未显示。
我想要发生的事情:显然,我希望 table1 以正确的值显示(即一列一行)(由 getValueAt(...) 返回)。
为什么没有调用 getValueAt(...) 方法,因此(我相信)表格没有显示?一般来说,fireTableStructureChanged() 是如何工作的?
提前致谢。
编辑(SSCCE):
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTable;
public class TestTableModel extends JFrame {
static JComboBox<String> choice5 = new JComboBox<String>(new String[]{"","1","2","3"});
static JTable table1 = new JTable(new MyTableModel(choice5));
static JFrame frame = new JFrame();
public static void main(String[] args) {
frame.setLayout(new BorderLayout());
choice5.addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
((MyTableModel)table1.getModel()).updateTable();
frame.pack();
}}});
frame.add(BorderLayout.SOUTH, choice5);
frame.add(BorderLayout.CENTER, table1);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
我的表模型
import javax.swing.JComboBox;
import javax.swing.table.AbstractTableModel;
public class MyTableModel extends AbstractTableModel{
JComboBox box;
public MyTableModel(JComboBox choice){
super();
box = choice;
}
public void updateTable(){this.fireTableStructureChanged();}
@Override
public int getColumnCount() {return box.getSelectedIndex();}
@Override
public int getRowCount() { return box.getSelectedIndex();}
@Override
public Object getValueAt(int row, int col) {return box.getSelectedItem();}
}