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

时间:2012-09-27 22:19:15

标签: java swing jtable jscrollpane tablemodel

我已经设置了一个带有分页的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);}

的ActionListener:

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();

}

1 个答案:

答案 0 :(得分:3)

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

  • ==比较两个变量是否指向同一个对象 - 您不关心的事情。因此,两个String变量可以保持相同的单词,但不能被此操作视为相等。
  • equals(...)equalsIgnoreCase(...)方法检查两个String变量是否按相同的顺序保存相同的字符,并且执行关注。

所以不是:

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阻止是否有效,请不要使用==来比较字符串,因为如果不是现在,很快就会咬你。