您好我有一个名为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的表的小例子?你知道,可以按下按钮吗?
答案 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;
}
}