2016-02-03 69 views
1

我期望一旦選擇了組合框,JTable將會改變。爲什麼不重新驗證()和repaint()像我期望的那樣工作?

這裏是我的部分代碼:

…… 
chooseAccoutingItemComboBox.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       changeTable(); 
       jScrollpane.revalidate(); 
       jScrollpane. repaint(); 
      } 

      private void changeTable() { 
       JTable accountTable2 = new JTable(accountBook.getRowData(startYear, startMonth, endYear, endMonth, (AccountingItem) chooseAccoutingItemComboBox.getSelectedItem()), accountBook.getColumnNames()); 
       accountTable = accountTable2; 
      } 
     }); 


    accountTable = new JTable(accountBook.getRowData(startYear, startMonth, endYear, endMonth, accountintItem), accountBook.getColumnNames()); 
     jScrollpane = new JScrollPane(accountTable); 
     add(jScrollpane, BorderLayout.CENTER); 
…… 

,現在當我在組合框中選擇項目時,JTable並沒有改變。爲什麼?

回答

4

你的Java是一個基本的核心錯誤,它與Swing無關,重新驗證或重繪,並且所有與核心區別有什麼區別Java引用變量和引用(或對象)

更改變量引用的對象對原始對象沒有任何影響。例如,您最初顯示的JTable對象(最初由accountTable變量引用的對象)完全不會改變,因爲您更改accountTable變量保存的引用,因此您的GUI不會更改。同樣明白,這不是在顯示的變量,而是對象

爲了實現自己的目標,你反而會想改變的狀態下顯示 JTable中。通過更改型號來實現。

即由做喜歡的事:

private void changeTable() { 
    // create a new table model 
    MyTableModel newModel = new MyTableModel(pertinentParameters); 

    // use the new model to set the model of the displayed JTable 
    accountTable.setModel(newModel); 
} 

使用您目前正在傳遞到您的新JTable中的參數:

accountBook.getRowData(startYear, startMonth, endYear, endMonth, 
     (AccountingItem) chooseAccoutingItemComboBox.getSelectedItem()), 
     accountBook.getColumnNames() 

以創建新的TableModel來代替。

事實上,你甚至可以直接創建一個DefaultTableModel這個數據是這樣的:

DefaultTableModel model = new DefaultTableModel(accountBook.getRowData(
    startYear, startMonth, endYear, endMonth, 
    (AccountingItem) chooseAccoutingItemComboBox.getSelectedItem()), 
    accountBook.getColumnNames()); 
accountTable.setModel(model); 
相關問題