0

我在我的项目中使用我的 JTable,我的 JTableModel。我无法用我的列标题和空数据开始表格。你能帮帮我吗?谢谢你。这是我的代码

主代码类

  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];
}
 }

它不是以列名开头的。这段代码有什么问题。我看到下图。 在此处输入图像描述

4

3 回答 3

2

因为您没有MyTable带参数的构造函数MyTableModel

您正在创建这样的表:

MyTable table=new MyTable(tm);

所以你必须在 MyTable 中有这样的构造函数:

class MyTable extends JTable {

   public MyTable(MyTableModel tm){
        super(tm);
    }
}

如果您MyTable在此处发布了代码,您的代码将无法编译!

于 2013-10-16T18:28:27.233 回答
1

很可能您没有添加JTablein aJScrollPane这将导致列名被隐藏

add(new JScrollPane(table));
于 2013-10-16T18:24:39.747 回答
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(...))。

于 2013-10-16T18:29:45.113 回答