我已经制作了一个显示JPanel的自定义TableCellRenderer。当JPanel包含交互式元素时,我希望这些元素也能工作,所以我做了一个自定义的TableCellEditor。它可以工作,但在JPanels中单击时会出现一些奇怪的行为。有时,单击时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);发布于 2011-11-24 23:27:19
我在这里看到了两个问题:
*重复放置AWT/SWING组件是不可取的!*
1)将同一组件添加两次会导致问题。Swing不喜欢相同的组件存在于不同的位置- gui的状态,绘图等,都是基于一个组件的模型--一个位置。我以前也遇到过和你类似的问题,一个组件因为被多次添加而变成空白……
缺少变量?
2)在代码中没有定义变量jPanel1/jPanel2。我假设这在您的实际代码中不是问题-所以如果您显示这些定义,可能会有其他问题。
https://stackoverflow.com/questions/8259103
复制相似问题