【问题标题】:Pass events in custom JTable在自定义 JTable 中传递事件
【发布时间】:2009-05-20 13:28:08
【问题描述】:

您好,我有一个名为 ColorChooser 的类(在 net.java.dev.colorchooser.ColorChooser 包中)

这是一个用于选择颜色的自定义组件。我想要的是在第二列中显示一个带有 ColorChooser 的 JTable。所以我创建了自己的 TableCellRenderer 并且它可以工作:

@SuppressWarnings("serial")
class ColorChooserTableRenderer extends DefaultTableCellRenderer {

    public static List<ColorChooser> colors;

    public ColorChooserTableRenderer(int rows) {
        colors = new ArrayList<ColorChooser>(rows);
        for (int i = 0; i<rows ; i ++) {
            colors.add(new ColorChooser());
        }
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        return colors.get(row);
    }

}

我在我的表中注册了这个:

JTable t = new JTable(5,3);
t.getColumn(t.getColumnName(1)).setCellRenderer(new ColorChooserTableRenderer(5));

显示效果不错。当我将鼠标悬停在其中一个上时,它甚至会显示 ColorChoosers 的工具提示。问题是 ColorChoosers 没有收到 MouseEvents。

通常,当您在 ColorChooser 上按住鼠标时,您会看到一个弹出窗口,您可以使用它来选择一种颜色。在 JTable 中 ColorChooser 组件没有收到鼠标事件时。

有什么解决办法吗?

编辑:问题可以很容易地修改为:

您能否给我一个小例子,说明第二列中包含实际工作的 JButton 的表格?你知道,可以按下的按钮吗?

【问题讨论】:

  • 你真的不想让颜色变成静态的(或公开的或非最终的)。

标签: java jtable


【解决方案1】:

这听起来有点熟悉,因为我一直将表格单元格渲染器用于其他目的。

我的理解是TableCellRenderer只是用来渲染组件;组件实际上并不存在于每个单元格中。

因此,您可能不得不以某种方式将鼠标事件从 JTable 本身转发到 ColorChooser。

编辑:附注,参见my question——同样对于自定义表格单元格渲染,如果列使用相同的逻辑渲染,则整个列只需要组件本身的 1 个实例。不要将持久状态存储在 TableCellRenderer 中,而是将其存储在 TableModel 中,并在处理对 getTableCellRendererComponent() 的调用时立即在渲染之前使用该状态。

【讨论】:

    【解决方案2】:

    渲染器只在屏幕上绘制组件,不允许交互。您还需要实现TableCellEditor。建议您继承AbstractCellEditor,您会节省一些工作。查看 java tutorial 的表格。

    例子:

    public class MyTableCellRenderer implements TableCellRenderer
    {
        private JButton button = new JButton("Press Me");
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            return button;
        }
    }
    
    public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor
    {
        private JButton button;
    
        public MyTableCellEditor()
        {
            button = new JButton("Press Me");
            button.addActionListener(new ActionListener(){
    
                public void actionPerformed(ActionEvent e) {
                    System.out.println("buttonPressed");
                }
            });
        }
        public Object getCellEditorValue() {
            return null;
        }
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            return button;
        }
    }
    

    【讨论】:

    • 为什么 Sun 让我们的生活变得困难。你能给我一个在第二列中包含实际工作的 JButtons 的表的小例子吗?你知道,可以按下的按钮吗?
    • 请给我几分钟 :)
    • 添加了一个毫无意义的示例,但这是您需要的最低限度
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多