我有一个 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 行填充表并调用此操作时,表无法正常运行:
- 存在 gui 重绘问题,新列仅显示
鼠标移到
jtable
上后;和 - 新列没有任何数据。
请帮忙。
最佳答案
我测试了你的代码,虽然我没有得到完全相同的错误,但有一些奇怪的事情:
首先,您将调用 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/