我正在编写一个小型POS应用程序,它在其单元格中显示了一个带有票证信息的JTable。 CellRenderer是一个扩展JPanel并实现TableCellRenderer的类,它包含一些显示基本信息(数量,描述,价格)的JTextField。 另外,我有另一个类扩展JPanel并实现TableCellEditor,它用作CellEditor。这个类包含更多的JTextFields和一些jButtons。
我需要的是简单的:当我通过点击鼠标(或触摸屏幕,也就是据我所知,同一事件)编辑任何单元格时,动态增加我要去的单元格的高度编辑,因此它可以显示编辑器中的所有组件。当我完成编辑后,将单元格高度返回到之前的值。
有关于这样做的想法吗?
提前致谢。 : - )
答案 0 :(得分:1)
CellRenderer是一个扩展JPanel并实现TableCellRenderer的类,它包含一些显示基本信息(数量,描述,价格)的JTextField。另外,我有另一个类扩展JPanel并实现TableCellEditor,它用作CellEditor。这个类包含更多的JTextFields和一些jButtons。
最好是根据来自JDialog
的事件创建弹出窗口(JPopupMenu
),
编辑时动态增加JTable行高,完成编辑时减少
不要混淆用户和错误的概念可能是由于在屏幕上跳跃JTables row
造成的
我需要的是简单的:当我通过点击鼠标(或触摸屏幕,也就是据我所知,同一事件)编辑任何单元格时,动态增加我要去的单元格的高度编辑,因此它可以显示编辑器中的所有组件。当我完成编辑后,将单元格高度返回到之前的值。
不要这样做,但必须覆盖,可以通过
DefaultCellEditor#setClickCountToStart(int)
TableCellEditor
start
,stop
和cancelEdit
CellEditor
必须notify
或re_Layout
JTable
,stop
和cancelEdit
答案 1 :(得分:1)
不是对如何调整rowHeights的答案,而是对于我的评论中提到的另一种选择:“仅仅大大超过”editorComponent而不是更新完整的rowHeight(我认为这对用户来说过于刺激,但最多你当然要决定:)
// fake a bigger editing component
JTextField oversized = new JTextField() {
@Override
public Dimension getPreferredSize() {
Dimension dim = super.getPreferredSize();
dim.height *= 5;
return dim;
}
};
TableCellEditor editor = new DefaultCellEditor(oversized);
JTable table = new JTable(new AncientSwingTeam()) {
@Override
public boolean editCellAt(int row, int column, EventObject e) {
boolean result = super.editCellAt(row, column, e);
if (result) {
// adjust cell bounds of the editing component
Rectangle bounds = getEditorComponent().getBounds();
bounds.height = getEditorComponent().getPreferredSize().height;
getEditorComponent().setBounds(bounds);
}
return result;
}
@Override
public void removeEditor() {
int editingColumn = getEditingColumn();
super.removeEditor();
if (editingColumn >= 0) {
// cleanup
repaint();
}
}
};
table.getColumnModel().getColumn(0).setCellEditor(editor);
答案 2 :(得分:0)
没试过,但我会说实施MouseListener的mouseClicked()
方法是可行的方法。跟踪细胞高度是否已经增加,并相应地改变高度。
由于MouseListener
是一个接口,CellRenderer
也可以实现此接口,将所有单元行为保留在一个类中。