Java JTable repaint() 方法在更改数据后不起作用
Java JTable repaint() method is not working after changing data
当我 运行 它时,table 应该是空的,但是在我单击 "Load Data" 按钮后我希望它显示我从数据库中获得的数据。当我查看这部分返回的数据时:
for (i=0; i < data.length; i++){
for (j=0; j < 4; j++){
if (data[i][j] != null)
System.out.print(data[i][j] + " ");
}
if (data[i][j-1] != null)
System.out.println();
}
是对的,我觉得没有问题。有人可以解释为什么 repaint()
不起作用或者我做错了什么吗?
这是我的代码:
public class UserInterface {
JFrame frame = new JFrame("User Interface");
JPanel panel = new JPanel();
JButton button = new JButton("Load Data");
JTable table;
JScrollPane scrollPane;
String[] columnNames = {"name", "age", "address", "phone number"};
String[][] data = new String[100][4];
public UserInterface(){
frame.getContentPane().setSize(200, 300);
table = new JTable(data, columnNames);
scrollPane = new JScrollPane(table);
panel.add(button);
panel.add(scrollPane);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ConnectDatabase cd = new ConnectDatabase();
try {
data = cd.getData();
System.out.println("we got the data from db on the ui.");
int i, j;
for (i=0; i<data.length; i++){
for (j=0; j<4; j++){
if (data[i][j] != null)
System.out.print(data[i][j] + " ");
}
if (data[i][j-1] != null)
System.out.println();
}
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
table.repaint();
scrollPane.repaint();
System.out.println("table repaint is done.");
}
});
}
@SuppressWarnings("unused")
public static void main(String[] args) {
// TODO Auto-generated method stub
UserInterface ui = new UserInterface();
}
}
当我在 data
中设置一个值时,它似乎对我有用。您正在使用 data = cd.getData();
更改数据对象,这样 table 就不知道您做了什么。尝试遍历返回的数据并更新原始数组,例如:
String[][] temp = cb.getData();
for (i=0; i<temp.length; i++){
for (j=0; j<4; j++){
data[i][j] = temp[i][j];
}
}
虽然这两个数组的大小会一样吗?我建议使用 TableModel 并执行此操作,例如:
DefaultTableModel model = new DefaultTableModel(new Object[]{"name", "age", "address", "phone number"},0);
table = new JTable(model);
// Now when you populate the table, you would do this for example:
String[][] temp = cb.getData();
for (i=0; i<temp.length; i++){
model.addRow(new Object[]{temp[i][0],temp[i][1],temp[i][2],temp[i][3]});
}
repaint
不是这样做的方法。您应该删除对 repaint() 的两个调用。
更新您的数组不会有什么不同,因为 JTable 在构建期间复制了它们并且根本不再使用它们。
您需要告诉 table 的模型使用新数据(的副本):
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setDataVector(data, columnNames);
当我 运行 它时,table 应该是空的,但是在我单击 "Load Data" 按钮后我希望它显示我从数据库中获得的数据。当我查看这部分返回的数据时:
for (i=0; i < data.length; i++){
for (j=0; j < 4; j++){
if (data[i][j] != null)
System.out.print(data[i][j] + " ");
}
if (data[i][j-1] != null)
System.out.println();
}
是对的,我觉得没有问题。有人可以解释为什么 repaint()
不起作用或者我做错了什么吗?
这是我的代码:
public class UserInterface {
JFrame frame = new JFrame("User Interface");
JPanel panel = new JPanel();
JButton button = new JButton("Load Data");
JTable table;
JScrollPane scrollPane;
String[] columnNames = {"name", "age", "address", "phone number"};
String[][] data = new String[100][4];
public UserInterface(){
frame.getContentPane().setSize(200, 300);
table = new JTable(data, columnNames);
scrollPane = new JScrollPane(table);
panel.add(button);
panel.add(scrollPane);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ConnectDatabase cd = new ConnectDatabase();
try {
data = cd.getData();
System.out.println("we got the data from db on the ui.");
int i, j;
for (i=0; i<data.length; i++){
for (j=0; j<4; j++){
if (data[i][j] != null)
System.out.print(data[i][j] + " ");
}
if (data[i][j-1] != null)
System.out.println();
}
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
table.repaint();
scrollPane.repaint();
System.out.println("table repaint is done.");
}
});
}
@SuppressWarnings("unused")
public static void main(String[] args) {
// TODO Auto-generated method stub
UserInterface ui = new UserInterface();
}
}
当我在 data
中设置一个值时,它似乎对我有用。您正在使用 data = cd.getData();
更改数据对象,这样 table 就不知道您做了什么。尝试遍历返回的数据并更新原始数组,例如:
String[][] temp = cb.getData();
for (i=0; i<temp.length; i++){
for (j=0; j<4; j++){
data[i][j] = temp[i][j];
}
}
虽然这两个数组的大小会一样吗?我建议使用 TableModel 并执行此操作,例如:
DefaultTableModel model = new DefaultTableModel(new Object[]{"name", "age", "address", "phone number"},0);
table = new JTable(model);
// Now when you populate the table, you would do this for example:
String[][] temp = cb.getData();
for (i=0; i<temp.length; i++){
model.addRow(new Object[]{temp[i][0],temp[i][1],temp[i][2],temp[i][3]});
}
repaint
不是这样做的方法。您应该删除对 repaint() 的两个调用。
更新您的数组不会有什么不同,因为 JTable 在构建期间复制了它们并且根本不再使用它们。
您需要告诉 table 的模型使用新数据(的副本):
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setDataVector(data, columnNames);