簡體   English   中英

Checkbox只在一個JTable Cell中

[英]Checkbox in only one JTable Cell

我想創建一個包含2列的JTable ,看起來像一個調查。 所以左邊是問題,右邊是用戶可以給出答案。 但是在一行中,右側應該有一個Checkbox,這樣用戶只能回答是或否。

這可能與JTable ,我怎樣才能做到這一點?

問候

您可以實現接口TableCellRenderer為具有不同對象的單元格創建自定義渲染器,如JTextField和JLabel。 您必須實現getTableCellRendererComponent方法,然后您可以使用要在單元格上顯示的組件返回一個組件(如JPanel或您希望的那樣)。 在表中,您將使用JTable.setDefaultRenderer()為自定義類設置新的渲染器。

如果您只有2個值,也許您也可以將數據設置為布爾值,並讓表格顯示為CheckBox(默認渲染)。

這是第二種方法的代碼,它看起來更像你想要的。

class CheckBoxModel extends AbstractTableModel{

        private final Object[][] rowData = {{"John" , true}, {"Mary", false}};
        final String columnNames[] = { "Student", "Approve" };

        @Override
        public int getRowCount() {
            return rowData.length;
        }

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

        @Override
        public Class<?> getColumnClass(final int columnIndex) {
            if (columnIndex == 1) {
                return Boolean.class; //renders column as a CheckBox
            }
            return super.getColumnClass(columnIndex);
        }

        @Override
        public Object getValueAt(final int rowIndex, final int columnIndex) {
            return rowData[rowIndex][columnIndex];
        }

        @Override
        public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) {
            rowData[rowIndex][columnIndex] = aValue;
            fireTableCellUpdated(rowIndex, columnIndex);
        }

        @Override
        public boolean isCellEditable(final int rowIndex, final int columnIndex) {
            return true;    //makes all cells editable
        }
}

還有一個測試類:

public class TestTable {

    public static void main(String[] args) {
        final JFrame frame = new JFrame("Editable Color Table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JTable table = new JTable(new CheckBoxModel());
        final JScrollPane scrollPane = new JScrollPane(table);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }
}

你在評論中說:

我嘗試了一個JCheckboxes它可以工作,但我只想在一個單元格中

注意這個要求有點棘手。 我認為你可以覆蓋getCellRenderer(int row,int column)getCellEditor(int row,int column)方法,詢問單元格值的類。

這樣,即使對表的行進行排序或重新排列表的列,單元格渲染器/編輯器也將成為JCheckbox

像這樣的東西:

    JTable table = new JTable(model) {
        @Override
        public TableCellRenderer getCellRenderer(int row, int column) {
            if(getValueAt(row, column) instanceof Boolean) {
                return super.getDefaultRenderer(Boolean.class);
            } else {
                return super.getCellRenderer(row, column);
            }
        }

        @Override
        public TableCellEditor getCellEditor(int row, int column) {
            if(getValueAt(row, column) instanceof Boolean) {
                return super.getDefaultEditor(Boolean.class);
            } else {
                return super.getCellEditor(row, column);
            }
        }
    };

這里有一個完整的例子。

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class Demo {

    private void createAndShowGUI() { 

        DefaultTableModel model = new DefaultTableModel(new Object[]{"Column # 1", "Column # 2"}, 0);
        model.addRow(new Object[]{"Property # 1", "Value # 1"});
        model.addRow(new Object[]{"Property # 2", Boolean.TRUE});
        model.addRow(new Object[]{"Property # 3", "Value # 3"});

        JTable table = new JTable(model) {
            @Override
            public TableCellRenderer getCellRenderer(int row, int column) {
                if(getValueAt(row, column) instanceof Boolean) {
                    return super.getDefaultRenderer(Boolean.class);
                } else {
                    return super.getCellRenderer(row, column);
                }
            }

            @Override
            public TableCellEditor getCellEditor(int row, int column) {
                if(getValueAt(row, column) instanceof Boolean) {
                    return super.getDefaultEditor(Boolean.class);
                } else {
                    return super.getCellEditor(row, column);
                }
            }
        };
        table.setAutoCreateRowSorter(true);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(new JScrollPane(table));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {                
                new Demo().createAndShowGUI();
            }
        });
    }    
}

截圖

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM