我已经设置了一个带有分页的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();
}
答案 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
阻止是否有效,请不要使用==
来比较字符串,因为如果不是现在,很快就会咬你。