在自定义JTable中传递事件

时间:2009-05-20 13:28:09

标签: java jtable

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

这是用于选择颜色的自定义组件。我想要的是在第二列中显示带有ColorChoosers的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的表的小例子?你知道,可以按下按钮吗?

2 个答案:

答案 0 :(得分:3)

这听起来很模糊,因为我一直在使用表格单元格渲染器用于其他目的。

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

所以你可能不得不以某种方式将鼠标事件从JTable本身转发到ColorChooser。

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

答案 1 :(得分: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;
    }
}