Как установить все флажки одним нажатием кнопки

Я новичок в 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;
        }
    }
} 
}

Слушатель действий просмотров

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

person mu_sa    schedule 24.10.2012    source источник
comment
Покажите, пожалуйста, реализацию табличной модели.   -  person tenorsax    schedule 24.10.2012
comment
controller.checkButtonControl(true); выполняется вообще? Непонятно / показано, как вы настраиваете контроллер.   -  person tenorsax    schedule 24.10.2012
comment
Да, это так. И когда я нажимаю «Выбрать все», я вижу в отладке, что все значения записи [0] истинны, а когда я нажимаю «Очистить», все значения записи [0] становятся ложными.   -  person mu_sa    schedule 24.10.2012
comment
перекрестно   -  person mKorbel    schedule 24.10.2012


Ответы (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);
}
person tenorsax    schedule 24.10.2012
comment
Шикарно, сработало! Спасибо. Кстати, не могли бы вы объяснить немного больше (отредактировать ответ) о том, как сделать это более эффективно. - person mu_sa; 24.10.2012
comment
вау, я попробовал ваш первый метод toggleSelection, и он работал без повторной проверки, перерисовки или getContentPane (). Теперь это выглядит так чисто, упрощенно и легко для понимания. 2 палец вверх :) - person mu_sa; 24.10.2012
comment
аааааааааааааааааааааааааадека более))) Я думаю, что вы сложные простые вещи, OP вернется сюда на всю оставшуюся часть :-) кстати +1 - person mKorbel; 24.10.2012

добавление revalidate() в PopulateAndShow может помочь

setSize(480, 580);
setResizable(false);
setVisible(true);
revalidate();
person Community    schedule 24.10.2012
comment
не могли бы вы опубликовать весь код, чтобы мы могли его скомпилировать и запустить самостоятельно? - person ; 24.10.2012