2014-12-01 58 views
0

我試圖在JTable中第一次加載文件名時,第一次按下按鈕時,它第一次按loads fine,但第二次按下同一按鈕時它goes blank當按下JButton時,JTable第二次變爲空白

短的例子:

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); 
    } 
} 
+2

1)爲了更好地幫助越早,張貼[MCVE](http://stackoverflow.com/help/mcve)(最小完備可驗證實施例)或[SSCCE](HTTP:// WWW。 )(簡短,獨立,正確的例子)。 2)'btnSearchContent.setBounds(913,175,124,23);'Java GUI必須在不同的操作系統上工作',屏幕大小,屏幕分辨率等。因此,它們不利於像素完美佈局。請使用佈局管理器或[它們的組合](http://stackoverflow.com/a/5630271/418556)以及[white space]的佈局填充和邊框(http://stackoverflow.com/a/17874718/ 418556)。 – 2014-12-01 15:36:32

+0

對於'Document Details'下面的東西,使用['JSeparator'](https://docs.oracle.com/javase/8/docs/api/javax/swing/JSeparator.html)。 – 2014-12-01 15:38:42

+0

感謝@AndrewThompson,我試圖發佈完整的代碼,但它給出了格式化錯誤,這就是爲什麼只發布了函數,現在已經在pastebin中發佈了[完整代碼](http://pastebin.com/B4ii3yVQ)謝謝 – 2014-12-01 15:42:09

回答

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(); 
} 
+0

JTable dosn't不需要重繪repaint();錯誤的建議基於不佳的問題 – mKorbel 2014-12-01 18:02:53

+0

謝謝@mKorbel,我帶** arooaroo **建議不要在每次重新構建一個新的表模型。如你所說,應該改變這個問題?我沒有找到你以前的帖子的任何類似的答案,謝謝 – 2014-12-02 09:18:31

+0

謝謝@ mkorbel,如果不重繪​​();你會建議什麼?謝謝 – 2014-12-02 10:44:34

相關問題