gpt4 book ai didi

java - 如何在按下 JButton 后清除 JTable 内容?

转载 作者:行者123 更新时间:2023-12-02 07:17:19 26 4
gpt4 key购买 nike

在我的程序中有一个 JTable 和 2 个名为“保存”和“刷新”的按钮。我的程序概述:

让我手动在 JTable 中输入 10 行。然后我通过单击“保存”按钮将这些数据更新到数据库中。

现在我的观点是:

当单击“刷新”按钮时,JTable 的所有行都应被清除以供下一个条目使用。

dataModel = new AbstractTableModel() {
private String[] columnNames = {"Sl No","Material Code", "Material Name", "Quntity", "Unit", "Unit/Price","Total Price", "Status" };//new String[9];
private Object[][] data = new Object[100][9];

public int getColumnCount() { return columnNames.length; }
public int getRowCount() { return data.length;}
public String getColumnName(int col) {
// TODO Auto-generated method stub
return columnNames[col];
}
public Object getValueAt(int row, int col) {
// TODO Auto-generated method stub
return data[row][col];
}

@Override
public void setValueAt(Object aValue, int row, int col) {
// TODO Auto-generated method stub
data[row][col] = aValue;
fireTableCellUpdated(row, col);
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return true;
}
public Class getColumnClass(int col) {
if((col == 3) || (col == 5) || (col == 6))
return Double.class;
//return getValueAt(0, c).getClass();
return String.class;
}
};

使用抽象数据模型创建表。

    table = new JTable(dataModel);
JTableHeader header = table.getTableHeader();
header.setBackground(Color.yellow);
JScrollPane pane = new JScrollPane(table);
pane.setPreferredSize(new Dimension(800, 350));
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

将此面板添加到 ContentPane。

   panel.add(pane);
panel.setBounds(100, 100, 800, 360);
c.add(panel);

框架有一个“刷新”按钮。 actionPerformed(ActionEvent e) {}我已手动将数据输入到 JTable 中。然后我通过单击“保存”按钮将这些数据更新到数据库中。

现在我的观点是:

当点击“刷新”按钮时,表格中的所有单元格都会被清除。

我已经实现了TableModeListner,如下所示。

public void tableChanged(TableModelEvent e) {
// TODO Auto-generated method stub
int row = e.getFirstRow();
int column = e.getColumn();

row_sl 初始化为 0。

 if(row_sl >= row){
if(column == 1){
String dat = (String) dataModel.getValueAt(row, column);
dataModel.removeTableModelListener(this);

//它获取数据库并重新命名 Material 名称和单位。然后将其设置到相应的列。

   mat.getmaterial_name(dat); 
dataModel.setValueAt(mat.materialname, row, column+1);
dataModel.setValueAt(mat.unit, row, column+3);
//dataModel.setValueAt(dat, 1, 2);
dataModel.addTableModelListener(this);
}
if((column == 5) && (Double)dataModel.getValueAt(row, 3) != null){
dataModel.removeTableModelListener(this);
Double d = (Double) dataModel.getValueAt(row, 3);
d = d * (Double)dataModel.getValueAt(row, column);
dataModel.setValueAt(d, row, 6);
dataModel.addTableModelListener(this);
}
if(row == row_sl && column == 7)
row_sl ++;
}
else
new error_frame("Complete the row no:"+row_sl);

public void actionPerformed(ActionEvent e) {
if(e.getSource() == Refresh){
dataModel.removeTableModelListener(this);
for (int i=0;i<=count;i++){
for(int j=0;j<=7;j++){
dataModel.setValueAt(null, i, j);
}
}
dataModel.addTableModelListener(this);
}
}

当单击“刷新”按钮时,将调用 dataModel.setValueAt(null, i, j); 方法。此方法会触发 TableModeListner 事件 public void tableChanged(TableModelEvent e)

因此问题就出现了。我的要求是:

当“点击刷新按钮时,所有表格单元格都应该被清除,而不影响我在此方法下的代码public void tableChanged(TableModelEvent e){

请在这方面向我提出建议。我有另一个选择,当单击“刷新”按钮时,它将通过放置最后一个来调用框架本身。这是好的做法吗?建议。

最佳答案

正如所讨论的here ,删除需要更新模型的内部数据结构。一种权宜之计的方法是简单地为一定数量的行和列创建数组:

data = new Double[rows][cols];
fireTableDataChanged();

还可以考虑用Arrays.fill()来取代默认值null

关于java - 如何在按下 JButton 后清除 JTable 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14769778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com