【发布时间】:2012-09-21 01:57:12
【问题描述】:
我在更新/刷新表中的数据时遇到问题。我正在使用 DefaultTableModel。这是代码,因此请分享您的知识和建议。最好的祝福。
*编辑 1:* 原始代码有一个更新表数据的函数,但由于构造函数一遍又一遍地创建新的 JTable 和新的 JScrollPane,因此证明是错误的。这就是我创建新构造函数并修复该错误的原因。在我实现新的构造函数后,表数据仍然没有刷新。接下来,我尝试调试构造函数接收到的其他类(passDatatoTable 类)的数据。在我使用函数 setValueAt() 和 System.out.println(getValueAt(i,1)) 之后,输出为空。就是这样 首先是创建 gui 的主类:
import javax.swing.*;
public class Glavni {
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui Scanner = new gui();
Scanner.setVisible(true);
}
});
}
}
第二个是向gui发送数据的类
public class passDatatoTable {
public void passData(){
String str1,str2,str3,str4;
for (int i =0;i<=10;i++){
str1="Column 1 of row: "+i;
str2="Column 2 of row: "+i;
str3="Column 3 of row: "+i;
str4="Column 4 of row: "+i;
gui SendStringsToGUI = new gui(str1, str2, str3, str4);
}
}
}
这里是 gui 类。按钮“添加数据”用于填充数据。这是代码:
public class gui extends JFrame implements ActionListener {
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);
int i=0;
public gui(String IP, String PC_NAME, String ttl, String gw) {
//Used this constructor to avoid creating new gui in other classes
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();
}
gui(){
JButton addData= new JButton("Add Data");
JButton next = new JButton("next");
JButton prev = new JButton("prev");
addData.addActionListener(this);
next.addActionListener(this);
prev.addActionListener(this);
JPanel panel = new JPanel(new BorderLayout());
JPanel buttonPanel = new JPanel();
buttonPanel.add(addData);
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。按钮 next 和 prev 用于分页,按钮“Add Data”用于创建“passDatatoTable”类的变量,用于填充表格数据
代码如下:
public void actionPerformed(ActionEvent e) {
if ("Add Data".equals(e.getActionCommand())){
passDatatoTable passSomeData = new passDatatoTable();
passSomeData.passData();
}
if ("next".equals(e.getActionCommand())) {
Rectangle rect = scrollPane.getVisibleRect();
JScrollBar bar = scrollPane.getVerticalScrollBar();
int blockIncr = scrollPane.getViewport().getViewRect().height;
bar.setValue(bar.getValue() + blockIncr);
scrollPane.scrollRectToVisible(rect);
}
if ("prev".equals(e.getActionCommand())) {
Rectangle rect = scrollPane.getVisibleRect();
JScrollBar bar = scrollPane.getVerticalScrollBar();
int blockIncr = scrollPane.getViewport().getViewRect().height;
bar.setValue(bar.getValue() - blockIncr);
scrollPane.scrollRectToVisible(rect);
}
}
【问题讨论】:
-
您可能希望花费一些精力来描述您的问题的细节。到底发生了什么?应该发生什么?您采取了哪些措施来尝试调试此问题?
-
好的,我会更新我的问题,我会针对这个问题做些什么
-
请不要再次发布完全相同的问题 - 而是坚持旧的并尝试理解答案
-
您还需要 1) 更改您的命名方案以符合 Java 命名约定。类名以大写字母开头,而方法和变量名以小写字母开头。以及 2) 接受您之前问题中的部分答案。
标签: java swing jtable jscrollpane defaulttablemodel