コードをテストしましたが、まったく同じエラーは発生しませんでしたが、奇妙なことがいくつかあります。
まず、 と の両方を呼び出してい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);
}
}