我测试了你的代码,虽然我没有得到完全相同的错误,但有一些奇怪的事情:
首先,您同时调用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);
}
}