gpt4 book ai didi

java - Jtable/JScrollPane 不会刷新(更新数据)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:44 24 4
gpt4 key购买 nike

我已经设置了一个带有分页功能的 JTable - 它工作得很好,但是我在将数据更新到表中时遇到了问题。 table.repaint() 不工作。这是我正在使用的代码。提前致谢!

String[][] data = new String[100][4];

String[] columnNames = new String[]{
"IP", "PC_NAME", "ttl", "db"};

构造函数:

gui(){
JTable table = new JTable(data, columnNames);
JScrollPane scrollPane = new JScrollPane(table);
JButton next = new JButton("next");
JButton prev = new JButton("prev");
next.addActionListener(this);
prev.addActionListener(this);
JPanel panel = new JPanel(new BorderLayout());
JPanel buttonPanel = new JPanel();
buttonPanel.add(prev);
buttonPanel.add(next);
panel.add(buttonPanel, BorderLayout.SOUTH);
panel.add(table.getTableHeader(), BorderLayout.PAGE_START);
panel.add(scrollPane, BorderLayout.CENTER);
getContentPane().add(panel);}

Action 监听器:

public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "next") {
Rectangle rect = scrollPane.getVisibleRect();
JScrollBar bar = scrollPane.getVerticalScrollBar();
int blockIncr = scrollPane.getViewport().getViewRect().height;
bar.setValue(bar.getValue() + blockIncr);
scrollPane.scrollRectToVisible(rect);
}
if (e.getActionCommand() == "prev") {
Rectangle rect = scrollPane.getVisibleRect();
JScrollBar bar = scrollPane.getVerticalScrollBar();
int blockIncr = scrollPane.getViewport().getViewRect().height;
bar.setValue(bar.getValue() - blockIncr);
scrollPane.scrollRectToVisible(rect);
}}

这是将数据存储到数组中的函数:

int i=0;
public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw)
{
data[i][0]=IP;
data[i][1]=PC_NAME;
data[i][2]=ttl;
data[i][3]=gw;
i++;
table.repaint();
scrollPane.repaint();

}

编辑 1:

我尝试使用 DefaultTableModel,但仍然没有成功。这是我用于更新表的代码。构造函数代码没有改变。声明:

private static final long serialVersionUID = 1L;
String[][] data = new String[100][4];

String[] columnNames = new String[]{
"IP", "PC_NAME", "ttl", "db"};



DefaultTableModel model = new DefaultTableModel(data,columnNames);
JTable table = new JTable(model);
JScrollPane scrollPane = new JScrollPane(table);

这是更新表的函数:

 public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw)
{

System.out.println(IP);
model.setValueAt(IP, i, 0);
model.setValueAt(PC_NAME, i, 1);
model.setValueAt(ttl, i, 2);
model.setValueAt(gw, i, 3);
i++;
model.fireTableDataChanged();
table.repaint();
scrollPane.repaint();

}

最佳答案

您的问题是您将字符串与 == 进行比较。请改用 equals(...) 方法。

  • == 比较两个变量是否引用同一个对象——这是您不关心的。因此,两个字符串变量可以包含相同的单词,但不会被此操作视为相等。
  • equals(...)equalsIgnoreCase(...) 方法检查两个字符串变量是否以相同的顺序保存相同的字符,并且您 < strong>确实关心。

所以不是:

if (e.getActionCommand() == "next") {
// ...
}

而是:

if ("next".equals(e.getActionCommand())) {
// ...
}

或者如果你不关心大小写:

if ("next".equalsIgnoreCase(e.getActionCommand())) {
// ...
}

编辑 1
接下来,一旦您的 JTable 拥有数据,更改数据可能不会对 JTable 产生影响。所以在这里你改变了数据数组:

int i=0;
public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw)
{
data[i][0]=IP;
data[i][1]=PC_NAME;
data[i][2]=ttl;
data[i][3]=gw;
i++;
table.repaint();
scrollPane.repaint();

}

但是这个数组已经被传递到 JTable 中,现在是它的模型的一部分,并且很可能已经变成了一个 Vector。

要查看 JTable 数据表示的变化,您必须更改表的模型 保存的数据。我建议您使用 DefaultTableModel 将数据保存在 JTable 中,然后在上面的方法(应以小写字母开头)中更改模型保存的数据。

此外,无论您的 if block 是否工作,都不要使用 == 来比较字符串,因为这会伤害您,如果不是现在,很快。

关于java - Jtable/JScrollPane 不会刷新(更新数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12630862/

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