我使用我的JTable,我的JTableModel用于我的项目。我无法使用列标题和空数据启动表。你能救我吗?谢谢。 这是我的代码
MainCode类
public class MainCode extends JFrame{
public MainCode(){
...........other codes here........
MyTableModel tm= new MyTableModel();
MyTable table=new MyTable(tm);
//JTable table=new JTable(tm); if I write this line,I see column names.
table.setPreferredScrollableViewportSize(new Dimension(480,80));
table.setFillsViewportHeight(true);
JScrollPane scrollPanetable=new JScrollPane(table);
frame.getContentPane().add(scrollPanetable)
........another codes...........
}
}
MyTable类
public class MyTable extends JTable{
public MyTable(){
}
public MyTable(int row,int col){
super(row,col);
}
@Override
public void tableChanged(TableModelEvent e){
super.tableChanged(e);
repaint();
System.out.println("public void tableChanged(TableModelEvent e)");
}
}
MyTableModel类
public class MyTableModel extends AbstractTableModel{
private String[] columnNames;
private Object[][] data;
public MyTableModel(){
super();
columnNames=new String[]{"A","B","C"};
data=new Object[][]{ {null,null,null}};
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
}
它不是以列名开头的。这段代码有什么问题。我看到下图。
答案 0 :(得分:2)
因为MyTable
中的构造函数没有参数MyTableModel
。
您正在创建这样的表:
MyTable table=new MyTable(tm);
所以你必须在MyTable中有这样的构造函数:
class MyTable extends JTable {
public MyTable(MyTableModel tm){
super(tm);
}
}
如果您在此处发布了MyTable
代码,则代码将无法编译!
答案 1 :(得分:1)
您很可能没有在JTable
中添加JScrollPane
,这会导致隐藏列名称
add(new JScrollPane(table));
答案 2 :(得分:1)
为什么要覆盖JTable?
您自己的评论if I write this line,I see column names
表明您的覆盖JTable是问题所在。你有一个被覆盖的tableChanged(...)
实现,文档说Application code will not use these explicitly, they are used internally by JTable.
否则,你的子类JTable没有做任何特殊的事情来保证子类化。
如果你必须是子类,你必须告诉子类如何使用你没有做过的模型(通过构造函数或setModel(...)
)。