0

我有一个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. 新列没有任何数据。

请帮忙。

4

1 回答 1

1

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

首先,您同时调用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);
    }

}
于 2013-07-27T23:18:24.647 回答