Checkbox只在一个JTable Cell中 [英] Checkbox in only one JTable Cell

查看:125
本文介绍了Checkbox只在一个JTable Cell中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个包含2列的 JTable ,这看起来像是一项调查。
所以左边是问题,右边是用户可以给出答案。
但是在一行中右侧应该有一个复选框,这样用户只能回答是或否。

I want to create an JTable with 2 columns, which looks like a survey. So on the left are the questions and on the right the user can give his answers. But in one line there should be a Checkbox on the right side, so that the user only can answer with yes or no.

这可能吗使用 JTable ,我该如何实现?

Is this possible to do with an JTable, and how can I achieve this?

问候

推荐答案

您已在评论中说明:


我尝试了一个列JCheckboxes它可以工作,但我只想在
一个单元格

I tried it with a column of JCheckboxes it works but I just want it in one cell

注意这个要求有点棘手。我想你可以覆盖 getCellRenderer(int row,int column) getCellEditor(int row,int column)要求单元格值类的方法。

Note this requirement is a little tricky. I think you can override getCellRenderer(int row, int column) and getCellEditor(int row, int column) methods asking for the cell value's class.

这种方式单元格渲染器/编辑器将是 JCheckbox ,即使表格的行已排序或表格的列重新排列。

This way the cell renderer/editor will be a JCheckbox even when the table's rows are sorted or table's columns are rearranged.

Something像这样:

Something like this:

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



示例



这是一个完整的示例使用。

Example

Here a complete example to play with.

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



截图



Screenshots

这篇关于Checkbox只在一个JTable Cell中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆