当按下JButton时,JTable第二次变为空白

时间:2014-12-01 15:34:04

标签: java swing jtable jbutton

我正在尝试加载文件名以及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);
    }
}

1 个答案:

答案 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();
}