0

I have a JTable that contains 4 columns and for example 10 rows. I want to add a new column and put the maximum value for each row in that.

Here is the function that I use to compute the maximum and put them into the new column:

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();
 } 

If my table does not have any row when I call this method the new column is added and shows up on the interface. However, when I populate my table with 10 rows and call this action, table is not acting properly:

  1. There is a gui redraw problem where the new column will show only after mouse goes on the jtable; and
  2. The new column does not have any data.

Please help.

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

補足として、AbstractTableModel を拡張して独自の TableModel を実装する場合、テーブル データを含むメモリ構造 (自分で作成および処理) が変更された場合、新しい値または新しい column/ でテーブルを更新する必要があります。行は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 に答える