3

我已经设置了一个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);}

动作监听器:

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

}
4

1 回答 1

3

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

  • ==比较两个变量是否引用同一个对象——你不关心的东西。因此,两个 String 变量可以包含相同的单词,但此操作不认为它们相等。
  • equals(...)or方法检查两个 String 变量是否以equalsIgnoreCase(...)相同的顺序保存相同的字符,并且您确实关心。

所以不是:

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 数据表示的变化,您必须更改表的model保存的数据。我建议您使用 DefaultTableModel 将数据保存在 JTable 中,然后在上面的方法(应以小写字母开头)中更改模型保存的数据。

此外,无论您的if块是否有效,都不要==用来比较字符串,因为如果不是现在,很快就会咬到您。

于 2012-09-27T22:25:37.850 回答