gpt4 book ai didi

java - JPanel 作为 TableCellEditor 消失

转载 作者:行者123 更新时间:2023-11-30 11:49:46 25 4
gpt4 key购买 nike

我制作了一个显示 JPanel 的自定义 TableCellRenderer。当 JPanel 包含交互式元素时,我希望它们也能工作,所以我制作了一个自定义 TableCellEditor。它可以工作,但是单击 JPanel 时会出现一些奇怪的行为。有时 JPanel 在单击时会消失。当我只设置一个自定义渲染器时,除了 JPanels 不是交互式的之外,没有任何问题。所以问题一定出在TableCellEditor上。

编辑:

public class PanelTableCellEditor
extends AbstractCellEditor
implements TableCellEditor
{
private Object _component;

@Override
public Object getCellEditorValue()
{
return _component;
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row,
int column)
{
_component = value;
if (value instanceof JPanel)
{
((Component) value).setForeground(UIManager.getColor("List.selectionForeground"));
((Component) value).setBackground(UIManager.getColor("List.selectionBackground"));
return ((Component) value);
}
else
{
return null;
}
}
}

渲染器:

public class PanelTableCellRenderer
extends Component
implements TableCellRenderer
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected,
boolean hasFocus, int row,
int column)
{
if (value instanceof JPanel)
{
if (isSelected || hasFocus)
{
((Component) value).setForeground(UIManager.getColor("List.selectionForeground"));
((Component) value).setBackground(UIManager.getColor("List.selectionBackground"));
}
else
{
((Component) value).setForeground(UIManager.getColor("Panel.foreground"));
((Component) value).setBackground(UIManager.getColor("Panel.background"));
}

return ((Component) value);
}
else
{
return new DefaultTableCellRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}

在主窗体中我有下一个代码:

DefaultTableModel model = new DefaultTableModel();
model.addColumn(null, new Object[]
{
jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1
});
jTable1.setModel(model);
TableColumn column = jTable1.getColumnModel().getColumn(0);
column.setCellRenderer(new PanelTableCellRenderer());
column.setCellEditor(new PanelTableCellEditor());
jTable1.setRowHeight(50);
jTable1.setTableHeader(null);
jScrollPane2.setColumnHeaderView(null);

最佳答案

我在这里看到两个问题:

*重复放置的 AWT/SWING 组件是禁忌! *

1) 将相同的组件添加到面板两次会导致问题。 Swing 不喜欢同一个组件存在于不同的位置——gui 的状态、去绘图等,都是基于一个组件的模型——一个位置。我过去遇到过与您类似的问题,其中一个组件因为被多次添加而变成空白......

缺少变量?

2) 变量 jPanel1/jPanel2 没有在你的代码中的任何地方定义。不过,我认为这在您的实际代码中不是问题 --- 所以如果您显示这些定义,可能会出现其他问题。

关于java - JPanel 作为 TableCellEditor 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8259103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com