【问题标题】:How to update Jtable immediately or automtically when I press a button按下按钮时如何立即或自动更新 Jtable
【发布时间】:2022-07-27 22:37:43
【问题描述】:

我创建了一个 Jtable,其中包含有关 f1 驱动程序的一些信息。以下代码适用于 Jtable

import java.awt.LayoutManager;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import java.awt.event.*;


public class Test1 extends JFrame implements ActionListener  {
JButton button;
Test1() {
    //setBounds(100, 100, 500, 400);
    
    JFrame frame = new JFrame();
    button = new JButton();
    
    //button.setBounds(50, 50, 20, 10);s
    button.setText("Random Race");
    button.addActionListener(this);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTable table = new JTable(new Model1Data()); 
   
    frame.setBounds(100, 100, 500, 400);
    JPanel panel = new JPanel();
    frame.add(panel);
    panel.add(new JScrollPane(table));
    panel.add(button);
    
    //add(new J
    frame.setVisible(true);
    //this.add(button);
    pack();
}
@Override
public void actionPerformed(ActionEvent e) {
    Formula1ChampionsManager d= new Formula1ChampionsManager();
    d.button();
    
}



}

这是 Model1Data 的代码。这是表格更新其单元格的代码。

import javax.swing.table.AbstractTableModel;

public class Model1Data extends AbstractTableModel implements ChampionsManager {


String colNames[] = { "Name", "Team", "No of first Places", "Total Points" };
Class<?> colClasses[] = { String.class, String.class, Integer.class, Integer.class };



public int getRowCount() {
    return myDrivers.size();
}

public int getColumnCount() {
    return colNames.length;
}

public Object getValueAt(int rowIndex, int columnIndex) {
    if (columnIndex == 0) {
        return myDrivers.get(rowIndex).getName();
    }
    if (columnIndex == 1) {
        return myDrivers.get(rowIndex).getTeam();
    }
    if (columnIndex == 2) {
        return myDrivers.get(rowIndex).getfirstPlace();
    }
    if (columnIndex == 3) {
        return myDrivers.get(rowIndex).totalPoints();
    }
    return null;
}

public String getColumnName(int columnIndex) {
    return colNames[columnIndex];
}

public Class<?> getColumnClass(int columnIndex) {
    return colClasses[columnIndex];
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
}

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    if (columnIndex == 0) {
        myDrivers.get(rowIndex).setName((String) aValue);
    }
    if (columnIndex == 1) {
        myDrivers.get(rowIndex).setTeam((String) aValue);
    }
    if (columnIndex == 2) {
        myDrivers.get(rowIndex).setfirstPlace((Integer) aValue);
    }
    if (columnIndex == 3) {
        myDrivers.get(rowIndex).settotalPoints((Integer) aValue);
    }
    
    //fireTableCellUpdated(rowIndex, columnIndex);

    
}

}

这就是表格 gui 的样子 Table GUI。当我单击该按钮时,No of first places 和 Total Points 的值会随机更改。但该表没有得到更新的值。如果我拉到框架的一侧,它就会更新。单击按钮时如何更新它?

【问题讨论】:

  • 如果您正在更新模型,它应该会自动更新。如果不是,您可能需要关闭 model.fireTableDataChanged()
  • 如果 Ryan 的建议不起作用,请尝试重新验证或重新绘制表格组件。您可以通过调用适当的方法以编程方式执行此操作。
  • @Ryan 我应该把它添加到哪里
  • @John 在您更新单元格值后立即在您的按钮功能中。或者,如果您知道行和列,您可以致电model.fireTableCellUpdated()。哦,你应该在 SwingWorker
  • @Ryan 实际上,对模型对象的更改和对 fireTableCellUpdated 的调用应该在 SwingWorker 或除事件调度线程之外的任何线程中完成。显然应该是长时间运行的任务,但是模型的最终更改应该在读取模型的线程中,即事件调度线程。

标签: java


【解决方案1】:

JTable 监听 TableModel 的变化。因此,AbstractTableModel 类具有诸如 fireTableCellUpdated(rowIndex, columnIndex) 之类的方法(您在代码中注释掉了 - 为什么?)。如果您覆盖方法setValueAt,那么您需要调用该方法,否则JTable 在其数据更改时不会更新。我猜想改变JFrame 的大小会导致JTable 重绘,这会导致JTable 从其模型中重新加载数据(但我可能是错的)。

您的类Model1Data 应该扩展DefaultTableModel,而不是AbstractTableModel,因为该类已经包含您需要的所有功能。 Model1Data 类需要覆盖的唯一方法是 getColumnClass(它已经这样做了)。您还需要覆盖至少一个构造函数。由于您没有发布minimal, reproducible example,我猜this constructor 可能是合适的。因此Model1Data 类的代码应该是:

public class Model1Data extends javax.swing.table.DefaultTableModel {
    Class<?> colClasses[] = { String.class, String.class, Integer.class, Integer.class };

    public Model1Data(Object[] columnNames, int rowCount) {
        super(columnNames, rowCount);
    }

    public Class<?> getColumnClass(int columnIndex) {
        return colClasses[columnIndex];
    }
}

Test1 类中(顺便说一下,它不需要扩展JFrame)你可以像这样创建JTable

JTable table = new JTable(new Model1Data(new String[]{ "Name", "Team", "No of first Places", "Total Points" }, 0));

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多