java - 在添加之前向具有一些行的 JTable 添加列

标签 java swing netbeans jtable defaulttablemodel

我有一个 JTable,其中包含 4 列,例如 10 行。我想添加一个新列并将每行的最大值放入其中。

这是我用来计算最大值并将其放入新列的函数:

private void jFindmaximumActionPerformed(java.awt.event.ActionEvent evt) {                                             
        DefaultTableModel model = (DefaultTableModel)jMYtable.getModel();
        TableColumn col = new TableColumn(model.getColumnCount());
        String headerLabel = "Maximum";
        col.setHeaderValue(headerLabel);
        jMYtable.addColumn(col);

        model.addColumn(headerLabel.toString(), new Object [0]);  
        double[] MAX = new double[ndata[0].length];
        for(int i = 0; i < ndata[0].length; i++){
            MAX[i] = ndata[i][0];
            for(int j = 0 ; j < ndata.length; j ++){
                if(ndata[j][i] > MAX[i]){
                    MAX[i] = ndata[j][i];
                }
            }
            model.setValueAt(MAX[i],i,4);
        }
        jMYtable.revalidate();
 } 

如果我的表在调用此方法时没有任何行,则会添加新列并显示在界面上。但是,当我用 10 行填充表并调用此操作时,表无法正常运行:

  1. 存在 gui 重绘问题,新列仅显示 鼠标移到jtable上后;和
  2. 新列没有任何数据。

请帮忙。

最佳答案

我测试了你的代码,虽然我没有得到完全相同的错误,但有一些奇怪的事情:

首先,您将调用 jMyTable.addColumn(...)model.addColumn(...)。这是一个错误。你只需要调用模型的addColumn即可。使用 JTable 方法添加列会产生不一致,因为 TableModel 和 TableColumnModel 不同步。

您在模型中添加新列的代码,并且最大值的计算是错误的。 i 应该在行中移动,j 应该在列中移动,然后检查我们是否应该执行 MAX[i] = ndata[i][j] ; 赋值。虽然传递 new Object[0] 似乎不会导致任何问题(因为具有 null 值的构造函数是有效的),但它没有任何意义。

应该是这样的:

private void jFindmaximumActionPerformed(java.awt.event.ActionEvent evt) {  
    DefaultTableModel model = (DefaultTableModel)jMYtable.getModel();
    String headerLabel = "Maximum";

    Object[] MAX = new Object[ndata.length];

    for(int i = 0; i < ndata.length; i++){
         MAX[i] = ndata[i][0];
          for(int j = 0 ; j < ndata[0].length; j ++){
                  if(ndata[i][j] > MAX[i]){
                        MAX[i] = ndata[i][j];
                  }
             }
    }
    model.addColumn(headerLabel, MAX);  
}

顺便说一句,如果您要实现自己的 TableModel,扩展 AbstractTableModel,当包含表数据的内存结构(由您自己创建和处理)发生更改时,您必须使用新值或更新表新的列/行更改使用 AbstractTableModel 类中的各种方法通知 JTable:fireTableDataChanged()fireRowsInserted()fireTableStructureChanged()...

更新:

这是一个简单的测试代码,它将列添加到 JTable。

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class SimpleColumnAdderFrame
{
    private DefaultTableModel _model;

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SimpleColumnAdderFrame().initUI();
            }
        });
    }

    public void initUI()
    {
        JFrame frame = new JFrame();        
        Object[][] data = {
                {1,2,3},
                {10,20,30}
        };
        String[] columnNames = {"Column 1", "Column 2", "Column 3"};        
        _model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable(_model);

        JButton addColumnButton = new JButton("Add column");
        addColumnButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                int columns = _model.getColumnCount();
                int rows = _model.getRowCount();
                Object[] columnData = new Object[rows];
                for (int i = 0; i < rows; ++i)
                {
                    columnData[i] = (int) ((columns + 1)*(Math.pow(10, i))); // <- Unnecessarily complicated cell value 
                }
                _model.addColumn("New Column " + (columns + 1), columnData);
            }   
        });

        JButton addRowButton = new JButton("Add row");
        addRowButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                int columns = _model.getColumnCount();
                int rows = _model.getRowCount();
                Object[] rowData = new Object[columns];
                for (int i = 0; i < columns; ++i)
                {
                    rowData[i] = (int) ((i+1)*(Math.pow(10, rows))); // <- Unnecessarily complicated cell value 
                }
                _model.addRow(rowData);
            }
        });

        JPanel buttonPanel = new JPanel(new GridLayout(1,2,2,2));
        buttonPanel.add(addColumnButton);
        buttonPanel.add(addRowButton);

        frame.add(new JScrollPane(table), BorderLayout.CENTER);
        frame.add(buttonPanel, BorderLayout.PAGE_END);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

}

关于java - 在添加之前向具有一些行的 JTable 添加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901296/

相关文章:

java - 将子节点添加到 SelectionPaths[]

javascript - Doppio:多线程如何工作?有什么限制吗?

JavaFX Button 释放事件

java - 在 play 2 框架中向 json 对象添加下拉列表项

java - 这两个例子中哪一个是更好的代码设计?

mysql - Java FXML - NetBeans - 从表中删除 - MySQL

java - 来自 Netbeans 的 Glassfish 连接

java - 如何在框架中显示图像?

java - 从 EDT 多次重新绘制 JPanel

java - 用SwingX的ImageView进行CollorAdjust?