2012-10-24 123 views
1

我是Swing,UI和MVC的新手 我已经创建了一个基于MVC的代码。现在我的问题是,在控制器部分,我有一个actioneventlistener,它可以监听不同的按钮点击。在所有这些按钮中,我有“全部选择”和“全部取消选择”。在我看来,我有一个表格,该表格的其中一列包含“复选框”。现在,当我点击“全选”按钮时,我想检查所有复选框,并选择“全部取消”,我想取消全部选中。如何点击一个按钮检查所有复选框

下面是我的代码不工作。请告诉我我在这里做错了什么。另外,如果有人知道更加灵活的方式,请分享。由于

在我看来

public class CustomerSelectorDialogUI extends JFrame{ 

    public CustomerSelectorDialogUI(TestApplicationUI ownerView, DummyCustomerStore dCStore, boolean modality) { 

    //super(ownerView, modality); 
    setTitle("[=] Customer Selection Dialog [=]"); 
    //setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
    custSelectPanel = new JPanel(); 
    buttonPanel = new JPanel(); 
    selectAllButton = new JButton(" Select All "); 
    clearAllButton = new JButton(" Clear All "); 
    applyButton = new JButton(" Apply "); 
    cancelButton = new JButton(" Cancel "); 

    PopulateAndShow(dCStore, Boolean.FALSE); 
} 

public void PopulateAndShow(DummyCustomerStore dCStore, Boolean select) { 
    List data = new ArrayList(); 
    for (Customer customer : dCStore.getAllCustomers()) { 
     Object record[] = new Object[COLUMN_COUNT]; 
     record[0] = (select == false) ? Boolean.FALSE : Boolean.TRUE; 
     record[1] = Integer.toString(customer.customerId); 
     record[2] = customer.fullName; 
     data.add(record); 
    } 
    tModel = new TableModel(data); 

      // In the above for loop accoring to user input (i.e click on check all or 
      // uncheck all) i have tried to update the data. As it can be seen that i 
      // have a condition for record[0]. 
      //After the loop, here i have tried several options like validate(). repaint but to no avail 

      customerTable = new JTable(tModel); 
    scrollPane = new JScrollPane(customerTable); 

    setContentPane(this.createContentPane()); 

    setSize(480, 580); 
    setResizable(false); 
    setVisible(true); 


} 

private JPanel createContentPane() { 
    custSelectPanel.setLayout(null); 

    customerTable.setDragEnabled(false); 
    customerTable.setFillsViewportHeight(true); 

    scrollPane.setLocation(10, 10); 
    scrollPane.setSize(450,450); 

    custSelectPanel.add(scrollPane); 

    buttonPanel.setLayout(null); 
    buttonPanel.setLocation(10, 480); 
    buttonPanel.setSize(450, 100); 
    custSelectPanel.add(buttonPanel); 

    selectAllButton.setLocation(0, 0); 
    selectAllButton.setSize(100, 40); 
    buttonPanel.add(selectAllButton); 


    clearAllButton.setLocation(110, 0); 
    clearAllButton.setSize(100, 40); 
    buttonPanel.add(clearAllButton); 

    applyButton.setLocation(240, 0); 
    applyButton.setSize(100, 40); 
    buttonPanel.add(applyButton); 

    cancelButton.setLocation(350, 0); 
    cancelButton.setSize(100, 40); 
    buttonPanel.add(cancelButton); 

    return custSelectPanel; 
} 
} 

表型号

private class TableModel extends AbstractTableModel { 

    private List data; 
    public TableModel(List data) { 
     this.data = data; 
    } 

    private String[] columnNames = {"Selected ", 
      "Customer Id ", 
      "Customer Name " 
    }; 

    public int getColumnCount() { 
     return COLUMN_COUNT; 
    } 
    public int getRowCount() { 
     return data == null ? 0 : data.size(); 
    } 

    public String getColumnName(int col) { 
     return columnNames[col]; 
    } 

    public void setValueAt(Object value, int rowIndex, int columnIndex) { 
     getRecord(rowIndex)[columnIndex] = value; 
     super.fireTableCellUpdated(rowIndex, columnIndex); 
    } 

    private Object[] getRecord(int rowIndex) { 
     return (Object[]) data.get(rowIndex); 
    } 

    public Object getValueAt(int rowIndex, int columnIndex) { 
     return getRecord(rowIndex)[columnIndex]; 
    } 

    public Class getColumnClass(int columnIndex) { 
     if (data == null || data.size() == 0) { 
      return Object.class; 
     } 
     Object o = getValueAt(0, columnIndex); 
     return o == null ? Object.class : o.getClass(); 
    } 

    public boolean isCellEditable(int row, int col) { 
     if (col > 0) { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 
} 

A浏览的动作监听

class CustomerSelectorUIListener implements ActionListener{ 

CustomerSelectorDialogUI custSelectView; 
Controller controller; 

public CustomerSelectorUIListener (Controller controller, CustomerSelectorDialogUI custSelectView) { 
    this.custSelectView = custSelectView; 
    this.controller = controller; 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    String actionEvent = e.getActionCommand(); 

    else if (actionEvent.equals("clearAllButton")) 
    { 
     controller.checkButtonControl(false); 
    }  
    else if (actionEvent.equals("selectAllButton")) 
    { 
     controller.checkButtonControl(true); 
    }  
} 
} 

主控制器

public class Controller implements ActionListener{ 

CustomerSelectorDialogUI selectUI; 
DummyCustomerStore store; 

public Controller(DummyCustomerStore store, TestApplicationUI appUI) 
{ 
    this.store = store; 
    this.appUI = appUI; 
    appUI.ButtonListener(this);   
} 

@Override 
public void actionPerformed(ActionEvent event) { 
    String viewAction = event.getActionCommand(); 

    if (viewAction.equals("TEST")) { 
     selectUI = new CustomerSelectorDialogUI(appUI, store, true); 
     selectUI.showTextActionListeners(new CustomerSelectorUIListener(this, selectUI)); 
     selectUI.setVisible(true); 
    } 
} 

public void checkButtonControl (Boolean checkAll) { 
    selectUI.PopulateAndShow(store, checkAll); 
}  
} 
+0

请出示表格模型的实现。 – tenorsax

+0

请参阅编辑 – LivingThing

+0

'controller.checkButtonControl(true);'是否被执行?目前尚不清楚/显示您如何设置控制器。 – tenorsax

回答

2

它看起来像问题与你重新创建表一旦按钮被点击的方式。您正在创建一个新表并将其添加到内容窗格。然而,旧的控制措施也保持在那里。如果添加:

getContentPane().removeAll(); 

在致电:

setContentPane(this.createContentPane()); 

它应该可以解决眼前的问题。但是,您应该考虑使用更有效的方式更新表格 - 只需更新模型或将其替换即可。不需要移除整个表格。

编辑:

下面是一个简化的例子,如何来更新模型:

public void toggleSelection(Boolean select) { 
    for (int rowIndex = 0; rowIndex < tModel.getRowCount(); rowIndex++) { 
     tModel.setValueAt(select, rowIndex, 0); 
    } 
} 

然后,就执行从控制器此方法。

您也可以在必要时重新建立模型,即(再次,简化):

public void toggleSelection(Boolean select) { 
    List data = new ArrayList(); 

    for (int idx = 0; idx < 5; idx++){ 
     Object record[] = new Object[] {select, "test", "test"}; 
     data.add(record); 
    } 

    TableModel model = new TableModel(data); 
    customerTable.setModel(model); 
} 
+0

真棒,工作!谢谢。那么,您能否更多地解释一下(编辑您的答案)如何更有效地做到这一点。 – LivingThing

+0

@LivingThing不客气!:) – tenorsax

+1

@LivingThing看看编辑是否澄清了一些事情。 – tenorsax

0

加入revalidate()PopulateAndShow可以帮助

setSize(480, 580); 
setResizable(false); 
setVisible(true); 
revalidate(); 
+0

试过,无法正常工作 – LivingThing

+0

可否请您发布所有代码,以便我们编译并运行自己? – 2012-10-24 04:52:40

相关问题