我有一个 Jtable 并分配为列渲染。 现在我想将特定单元格分成两部分,以便我可以为其提供两个值。 分割可以通过 Cellrenderer 进行,也可以通过其他方式进行。
最佳答案
使用 JPanel
和 GridLayout作为单元格渲染器:
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,int row,int col) {
if (isSplitted(value) {
JPanel panel = new JPanel(new GridLayout(1,2));
JLabel left = new JLabel(getLeft(value));
JLabel right = new JLabel(getRight(value));
panel.add(left);
panel.add(right);
return panel;
} else {
return super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, col)
}
}
此处,getLeft
、getRight
和 isSplitted
由您定义在该单元格中呈现的值。
如果有意义的话,您还可以优化保留带有两个标签的该面板的实例;设置所需内容后,可以在每次调用时重复使用它。对于左右组件大小相差很大的情况,BorderLayout 可能效果更好。
同样,您可以提供单元格编辑器,只需要 JTextField
等,因为 JLabel
不可编辑。源自AbstractCellEditor ,重写 getCellEditorValue
(返回由面板组成的值)和 getTableCellEditorComponent
(将字段设置为当前值后返回面板本身)。
@Stifler 对我的回答发表了评论:
public Component getTableCellRendererComponent(JTable table, Object obj,
boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(
table, obj, isSelected, hasFocus, row, column);
JPanel panel = new JPanel(new GridLayout(1, 2));
if ("History".equals(obj)) {
JTextField left = new JTextField("Left");
left.setEditable(true);
JTextField right = new JTextField("Right");
left.setEditable(true);
panel.add(left);
panel.add(right);
return panel;
}
return cell;
}
关于java - 需要在 Swing Java 中将特定单元格拆分为两个 JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17206617/