Я должен установить флажок два раза, чтобы проверить / снять флажок в jTable - PullRequest
0 голосов
/ 30 марта 2010

У меня есть код jTable, который я собираюсь использовать, но проблема в том, что когда я нажимаю на флажок, когда он не выбирает / отменяет выбор, вместо этого я должен щелкнуть дважды Но если я выберу любую другую ячейку в строке, кроме той, которая содержит флажок, цель будет решена.

ЗДЕСЬ МОЙ КОД:

public class TableSelectionTest extends JFrame implements ListSelectionListener {
private final int COLUMN_COUNT = 5;
private TblModel model;
public TableSelectionTest() {
    initialize();
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
}
private void initialize() {
    List data = new ArrayList();
    for (int i = 0; i < 10; i++) {
    Object record[] = new Object[COLUMN_COUNT];
    record[0] = Boolean.FALSE;
    for (int j = 1; j < COLUMN_COUNT; j++)
    {
        record[j] = new Integer(j);
    }
    data.add(record);
}
model = new TblModel(data);
JTable table = new JTable(model);
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener (this);
JScrollPane scroll = new JScrollPane(table);
getContentPane().add(scroll, BorderLayout.CENTER);
}

public static void main(String[] args) {
TableSelectionTest f = new TableSelectionTest();
f.show();
}

class TblModel extends AbstractTableModel {
    private List data;
    public TblModel(List data) {
        this.data = data;
    }
    public int getColumnCount() {
        return COLUMN_COUNT;
    }
    public int getRowCount() {
        return data == null ? 0 : data.size();
    }
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        getRecord(rowIndex)[columnIndex] = value;
        super.fireTableCellUpdated(rowIndex, columnIndex);
    }
    public Object getValueAt(int rowIndex, int columnIndex) {
        return getRecord(rowIndex)[columnIndex];
    }
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        if(columnIndex == 0)
            return true;
        else
            return false;
    }
    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();
    }
    private Object[] getRecord(int rowIndex) {
        return (Object[]) data.get(rowIndex);
    }
}

public void valueChanged(ListSelectionEvent e) {
    if (!e.getValueIsAdjusting()) {
        ListSelectionModel lsm = (ListSelectionModel) e.getSource();
        int index = lsm.getMinSelectionIndex();
        if(model.getRecord(index)[0] == Boolean.FALSE)
            model.setValueAt(Boolean.TRUE, index, 0);
        else if(model.getRecord(index)[0] == Boolean.TRUE)
            model.setValueAt(Boolean.FALSE, index, 0);
    }
}
}

Пожалуйста, ответьте как можно быстрее Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 30 марта 2010

Усиливая при правильном ответе @ rob, ваш ListSelectionListener сбрасывает значение при каждом изменении; нажмите на таблицу, чтобы увидеть эффект. Ваш метод setValueAt() уже обновляет данные; добавьте это println() чтобы увидеть:

for (Object row : data) {
    System.out.println(((Object[]) row)[0]);
}

Кроме того, рассмотрите возможность сделать ваш data более универсальным и избегайте устаревших методов, таких как show().

Приложение: вот пример; см. также Как использовать таблицы .

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class TableSelectionTest extends JFrame {

    private final int COLUMN_COUNT = 5;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TableSelectionTest();
            }
        });
    }

    public TableSelectionTest() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTable table = new JTable(new TblModel());
        JScrollPane scroll = new JScrollPane(table);
        this.add(scroll, BorderLayout.CENTER);
        pack();
        this.setVisible(true);
    }

    class TblModel extends AbstractTableModel {

        private Random rnd = new Random();
        private List<Boolean> data = new ArrayList<Boolean>();

        public TblModel() {
            for (int i = 0; i < 10; i++) {
                data.add(rnd.nextBoolean());
            }
        }

        @Override
        public int getColumnCount() {
            return COLUMN_COUNT;
        }

        @Override
        public int getRowCount() {
            return data.size();
        }

        @Override
        public void setValueAt(Object value, int rowIndex, int columnIndex) {
            if (columnIndex == 0) {
                data.set(rowIndex, (Boolean) value);
            }
            super.fireTableCellUpdated(rowIndex, columnIndex);
            for (Boolean b : data) {
                System.out.print(b + " ");
            }
            System.out.println();
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            if (columnIndex == 0) {
                return data.get(rowIndex);
            } else {
                return columnIndex;
            }
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return columnIndex == 0;
        }

        @Override
        public Class getColumnClass(int columnIndex) {
            if (columnIndex == 0) {
                return Boolean.class;
            } else {
                return Integer.class;
            }
        }
    }
}
1 голос
/ 30 марта 2010

Ваш ListSelectionListener конфликтует с вашим TableCellEditor.

В идеале, я бы предложил удалить ListSelectionListener. В этом нет необходимости, поскольку TableCellEditor просто вызывает setValueAt () для обновления содержимого ячейки.

...