以正确的顺序向 JTable 添加行。

Posted

技术标签:

【中文标题】以正确的顺序向 JTable 添加行。【英文标题】:Adding rows to JTable in the right order. 【发布时间】:2012-11-22 16:23:01 【问题描述】:

我正在编写一个代码,其中数据是从数组的arraylist 中收集的,我将其添加到JTable 中。但是,代码总是将数据从底部向上添加,因此如果有两行数据,它会将它们添加到最后两行,而不是前两行。这是相关代码,

public class RegistrationView extends GUIDesign implements ActionListener 

//variable declarations here. 

public RegistrationView (GTPort gport)

    super("Student Report", 3);

    gtPort = gport;

    setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS));
    setPreferredSize(new Dimension(500,800));

    header = new JPanel();
    header.setSize(getWidth(), 30);
    body = new JPanel();
    body.setLayout(new BoxLayout(body,BoxLayout.Y_AXIS));

    header.setBackground(color);
    title.setFont(new Font("Helvetica", 1,20));
    header.add(title);

    data = new Object[15][4];

    model = new DefaultTableModel(data, columns);

    table = new JTable(model);


    body.add(table.getTableHeader()); 
    body.add(table);


    backButton.addActionListener(this);
    buttonPanel.add(backButton);

    buttonPanel.add(backButton);
    add(header);
    add(body);
    add(buttonPanel);



public void refresh()

           //this is the data to be added. it is an arraylist of object arrays. 
    ArrayList<Object[]> selectedData = gtPort.selectedData;

           //i use this code to erase all the data in the table, if there is any. this                   //method may be called later, so the data must be erased. 
    model.setRowCount(0);
    table = new JTable(model);
    model.setRowCount(35);

    //adding the rows to the model, which is then added to the table. 

    for (Object[] objects: selectedData)
    
        model.addRow(objects);


    

    table = new JTable(model);




//谢谢。

【问题讨论】:

【参考方案1】:

在表格底部添加行,因为如果您使用 .. addRow(..) method,DefaultTableModel 将在末尾添加行,如 javadoc 中所述。使用insertRow(..) 方法在特定位置插入行。但请注意ArrayOutOfBoundException.

如 javadoc 中所述,

 public void insertRow(int row, Object[] rowData)

在模型中的 row 处插入一行。除非指定了 rowData,否则新行将包含空值。将生成正在添加的行的通知。

 public void addRow(Object[] rowData)

在模型末尾添加一行。除非指定了 rowData,否则新行将包含空值。将生成正在添加的行的通知。

【讨论】:

【参考方案2】:

通过设置行数两次,将元素添加到 JTable 之后,看起来好像是在添加行。它应该为您填充,而不必设置行数。要在更改后刷新您的表格,请尝试使用 fireTableDataChanged(); 并查看 http://docs.oracle.com/javase/tutorial/uiswing/components/table.html,了解如何正确构建您的布局。

【讨论】:

如果您使用的是 AbstractTableModel,则需要 fireTableDataChanged()。但在这种情况下,OP 使用的是 DefaultTableModel,所以我认为不需要 fire 方法。如果我错了,请纠正我。 希望您不要建议从模型外部触发 XX ;-) 通知其听众是模型本身的专属责任。【参考方案3】:

model.addRow(objects); 更改为model.insertRow(0, objects);

【讨论】:

好的,这很有帮助。它现在填充屏幕的上半部分而不是下半部分,但仍以相反的顺序添加,因此 Faculty#9 出现在第一个插槽中,而 #1 出现在最后一个插槽中。

以上是关于以正确的顺序向 JTable 添加行。的主要内容,如果未能解决你的问题,请参考以下文章

如何在按钮单击时将新行添加到数据库中的jTable而不清除现有行

向tableview添加行以添加行和核心数据

如何仅使用列标题创建JTable,不添加任何行

使用Java在jtable和数据库中添加行

如何将两种类型的值添加到JTable行?

JTable 滚动到指定的行索引