0

この問題は長い間私を悩ませてきました。それは非常に厄介で、私は専門家にそれを示すサンプルを準備することができました. これをコピーして貼り付けるだけです:

public class CellBorderDemo extends JFrame
{
    private JTable dataSearchResultTable;
    private boolean selectRow = false;

    public CellBorderDemo()
    {
        JPanel panel = new JPanel(new GridLayout(2, 1, 5, 10));
        panel.setPreferredSize(new Dimension(500, 300));
        MyTableModel myTableModel = new MyTableModel();
        dataSearchResultTable = new JTable();
        dataSearchResultTable.addKeyListener(new KeyAdapter()
        {
            private String attemptId = new String();

            @Override
            public void keyTyped(KeyEvent e)
            {
                System.out.println("selectRow=" + selectRow + " keyChar=" + (int) e.getKeyChar() + " event=" + e);
                if ((e.getModifiers() == KeyEvent.CTRL_MASK && (int) e.getKeyChar() == 10)) {
                    System.out.println("Ctrl+J was pressed when focus was ok");
                    selectRow = true;
                    attemptId = new String();
                    dataSearchResultTable.editCellAt(-1, -1);
                    dataSearchResultTable.getSelectionModel().clearSelection();
                    return;
                } else if ((int) e.getKeyChar() == 32) {
                    return;
                }
                if (selectRow) {
                    char keyChar = e.getKeyChar();
                    if (keyChar >= 48 && keyChar <= 57) {
                        attemptId += String.valueOf(keyChar);
                        if (selectRow(Integer.valueOf(attemptId).intValue())) {
                            System.out.println("attemptId=" + attemptId);
                            return;
                        }
                    }
                    selectRow = false;
                    attemptId = new String();
                }
            }
        });

        dataSearchResultTable.setSelectionBackground(new Color(0xbbccdd));
        dataSearchResultTable.setSelectionForeground(new Color(0x333300));
        dataSearchResultTable.setFillsViewportHeight(true);
        dataSearchResultTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        dataSearchResultTable.setAutoCreateRowSorter(true);
        dataSearchResultTable.setRowHeight(30);
        dataSearchResultTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        dataSearchResultTable.getColumnModel().setColumnMargin(0);
        dataSearchResultTable.setPreferredScrollableViewportSize(dataSearchResultTable.getPreferredSize());

        dataSearchResultTable.setModel(myTableModel);

        panel.add(new JScrollPane(dataSearchResultTable));
        super.getContentPane().add(panel);
        super.pack();
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.setVisible(true);
    }

    public boolean selectRow(int attemptId)
    {
        MyTableModel tableModel = (MyTableModel) dataSearchResultTable.getModel();
        int row = 0;
        if (attemptId >= 0 && attemptId < tableModel.getRowCount()) {
            System.out.println("rowToSelect=" + row);
            dataSearchResultTable.setRowSelectionInterval(attemptId, attemptId);
            dataSearchResultTable.setColumnSelectionInterval(2, 2);
            tableModel.fireTableCellUpdated(row, 2);
            dataSearchResultTable.requestFocusInWindow();
            return true;
        }
        return false;
    }

    class MyTableModel extends AbstractTableModel
    {
        private String[] columnNames = { "First Name", "Last name", "Vegetarian" };
        private Object[][] data;
        int prefRow = 1, prefCol = 2;

        MyTableModel()
        {
            data = new Object[][] { { "Vova", "KipokKipokKipokKipok", false }, { "Olia", "Duo", true },
                    { "Ivan", "Brown", false } };
        }

        public int getColumnCount()
        {
            return columnNames.length;
        }

        public int getRowCount()
        {
            return data.length;
        }

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

        public Object getValueAt(int row, int col)
        {
            if (data.length > 0 && data[0] != null) {
                return data[row][col];
            }
            return null;
        }

        public Class getColumnClass(int c)
        {
            Object valueAt = getValueAt(0, c);
            return valueAt == null ? Object.class : valueAt.getClass();
        }

        public boolean isCellEditable(int row, int col)
        {
            return true;
        }

        public void setValueAt(Object value, int row, int col)
        {
            if (data.length > 0 && data[0] != null) {
                if (data[row][col] instanceof Boolean && (Boolean) value) {
                    setValueAt(false, prefRow, prefCol);
                    prefRow = row;
                    prefCol = col;
                }
                data[row][col] = value;
                fireTableCellUpdated(row, col);
            }
        }
    }

    public static void main(String[] args) throws ParseException
    {
        new CellBorderDemo();
    }
}

長いのはわかります。クラス MyTableModel はまったく見ないでください。keylistener と selectRow メソッドだけを見てください。ここで Ctrl+J を押してから、0 または 1 または 2 のいずれかを押してください。適切な行が選択されていることがわかります。スペースを押してチェックボックスを選択できます。ここでもう一度 Ctrl+J を押して 0 から 2 までの数字を押しますが、最初の試行とは異なるはずです。new number に従って新しい行が選択されていることがわかります。スペースを押すと、新しいセルが選択されたがフォーカスされていないという問題が表示されます。そのため、以前に選択したチェックボックスを選択解除しましたが、現在選択されていません。

この機能は非常に重要であるため、このヘルプに非常に感謝しています。

ありがとうございました!

4

1 に答える 1

1

selectRowメソッドの次の問題は、row変数を常に0に変更することはありません。次の例では、行変数を変更し、その行をeditCellAtメソッドで編集しようとします

public boolean selectRow(int attemptId) {
    MyTableModel tableModel = (MyTableModel) dataSearchResultTable.getModel();
    int row = 0;
    if (attemptId >= 0 && attemptId < tableModel.getRowCount()) {
        System.out.println("rowToSelect=" + row);
        dataSearchResultTable.setRowSelectionInterval(attemptId, attemptId);
        dataSearchResultTable.setColumnSelectionInterval(2, 2);
        tableModel.fireTableCellUpdated(row, 2);
        dataSearchResultTable.requestFocusInWindow();
        row = dataSearchResultTable.getSelectedRow();
        if(row != -1){
            dataSearchResultTable.editCellAt(row, 2);
        }
        return true;
    }
    return false;
}

私はそれがあなたが何を望んでいると思います。

于 2013-11-12T12:59:30.103 に答える