我正在尝试加载文件名以及JTable中的一些细节,第一次按下按钮时,loads fine,但第二次按下同一按钮goes blank
简短的例子:
package exampleDemo;
public class JTableExample {
private JFrame frame;
private JTable table_1;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JTableExample window = new JTableExample();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public JTableExample() {
initialize();
}
public void showEmptyTable() {
final String[] colNames = {"Sl.no.", "File Name", "Size", "Last Modified", "PO", "LN", "SI", "MS", "PT"};
final String[][] emptyData = {
{"", "", "", "", "", "", "", "", "",},
{"", "", "", "", "", "", "", "", "", },
{"", "", "", "", "", "", "", "", "", },
{"", "", "", "", "", "", "", "", "", },
{"", "", "", "", "", "", "", "", "", },};
table_1.setModel(new DefaultTableModel(emptyData, colNames));
frame.getContentPane().add(table_1);
JScrollPane scrollPane = new JScrollPane(table_1);
scrollPane.setBounds(81, 162, 830, 180);
frame.getContentPane().add(scrollPane);
};
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 1002, 576);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
table_1 = new JTable();
table_1.setBounds(81, 162, 830, 180);
frame.getContentPane().add(table_1);
JButton btnNewButton = new JButton("New button");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
table_1.repaint();
showEmptyTable();
}
});
btnNewButton.setBounds(578, 70, 89, 23);
frame.getContentPane().add(btnNewButton);
}
}
答案 0 :(得分:1)
快速浏览一下你的代码就会向我建议你以错误的方式解决这个问题:每次点击按钮时你都会重建一个新的表模型而我怀疑(尽管这只是一个预感那一刻)是因为每次你点击那个按钮,你都会通过一个新的滚动面板将相同的表添加到主JFrame中 - 每次都是。
您要做的是在加载框架期间初始化表格及其模型。然后,如果要清除表格,则只需获取对该表格模型的引用并操纵现有模型。就是这样 - 不需要创建一个全新的模型;无需通过滚动面板添加新表。
所以我在你的例子中做的是在构造函数中添加一行:
public YourClassName() {
initialize();
initializeYourTable();
}
然后initializeYourTable()
看起来像这样:
private void initSearchTable() {
final String[] colNames = {"Sl.no.", "File Name", "Size", "Last Modified", "PO", "LN", "SI", "MS", "PT"};
//PO: Part Order
//LN: Line Number
//SI: Serial Number
//MS: Material Supplier
//PT: Part Item
final String[][] emptyData = {
{"", "", "", "", "", "", "", "", "",},
{"", "", "", "", "", "", "", "", "",},
{"", "", "", "", "", "", "", "", "",},
{"", "", "", "", "", "", "", "", "",},
{"", "", "", "", "", "", "", "", "",},};
table_3.setModel(new DefaultTableModel(emptyData, colNames));
//frmViperManufacturingRecord.getContentPane().add(table_3); <-- NB this should be commented out!!
table_3.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table_3.getColumnModel().getColumn(0).setPreferredWidth(40);
table_3.getColumnModel().getColumn(1).setPreferredWidth(290);
table_3.getColumnModel().getColumn(2).setPreferredWidth(80);
table_3.getColumnModel().getColumn(3).setPreferredWidth(178);
table_3.getColumnModel().getColumn(4).setPreferredWidth(25);
table_3.getColumnModel().getColumn(5).setPreferredWidth(25);
table_3.getColumnModel().getColumn(6).setPreferredWidth(25);
table_3.getColumnModel().getColumn(7).setPreferredWidth(25);
table_3.getColumnModel().getColumn(8).setPreferredWidth(25);
JScrollPane scrollPane = new JScrollPane(table_3);
scrollPane.setBounds(324, 209, 713, 160);
frmViperManufacturingRecord.getContentPane().add(scrollPane);
}
要清除表格,您可以使用此shortcut:
private void resetTable() {
DefaultTableModel model = (DefaultTableModel)table_3.getModel();
model.setRowCount(0);
}
因此您需要更改actionPerformed
:
public void actionPerformed(ActionEvent arg0) {
table_3.repaint();
//showEmptyTable();
resetTable();
}