2016-02-03 67 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); 
相关问题