条件:
我有关于SWT表单元的问题,
在此,我将在SWT表单元格中写入任何文本,然后按键盘ENTER键。当我按下键时,文本以换行符开始。
题:
在同一单元格中以新行开始的键事件(键盘“ ENTER”键)的代码是什么?
在这里,SWT表示例代码:
public class KeyEnter {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Table table = new Table(shell, SWT.FULL_SELECTION
| SWT.HIDE_SELECTION);
TableColumn column1 = new TableColumn(table, SWT.NONE);
TableColumn column2 = new TableColumn(table, SWT.NONE);
for (int i = 0; i < 10; i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(new String[] { "item " + i, "edit this value" });
}
column1.pack();
column2.pack();
final TableEditor editor = new TableEditor(table);
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.minimumWidth = 50;
// editing the second column
final int EDITABLECOLUMN = 1;
table.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
// Clean up any previous editor control
Control oldEditor = editor.getEditor();
if (oldEditor != null)
oldEditor.dispose();
// Identify the selected row
TableItem item = (TableItem) e.item;
if (item == null)
return;
// The control that will be the editor must be a child of the
// Table
Text newEditor = new Text(table, SWT.NONE);
newEditor.setText(item.getText(EDITABLECOLUMN));
newEditor.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent me) {
Text text = (Text) editor.getEditor();
editor.getItem().setText(EDITABLECOLUMN, text.getText());
}
});
newEditor.selectAll();
newEditor.setFocus();
editor.setEditor(newEditor, item, EDITABLECOLUMN);
}
});
shell.setSize(300, 300);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
屏幕截图:
这种输出要到SWt表中。
最佳答案
好吧,我试了一下,这确实是一件很奇怪的事情。我设法通过以下方式使其工作:每当编辑器的内容发生更改时,就会调用表的redraw()
方法(如果表很大,这会很昂贵)。这将确保表格始终显示正确的项目(行)高度。我还添加了每次更改都会调用编辑器的layout()
方法,以便在行高更改并且当前正在编辑的项目在表格中上下移动(由更改引起)的情况下重新放置该方法。物品高度)。
这绝不是一个很好的解决方案,但确实可以完成。也许您可以对其进行微调并进行一些改进。
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("Stackoverflow");
final Table table = new Table(shell, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
table.setHeaderVisible(true);
table.setLinesVisible(true);
int columnCount = 3;
for (int i = 0; i < columnCount; i++)
{
TableColumn column = new TableColumn(table, SWT.BORDER);
column.setText("Column " + i);
}
for (int i = 0; i < 10; i++)
{
TableItem item = new TableItem(table, SWT.BORDER);
item.setText(new String[]{"cell " + i + " 0", "cell " + i + " 1", "cell " + i + " 2"});
}
final Listener paintListener = event ->
{
switch (event.type)
{
case SWT.MeasureItem:
{
TableItem item = (TableItem) event.item;
String text = item.getText(event.index);
Point size = event.gc.textExtent(text);
event.width = size.x;
event.height = Math.max(event.height, size.y);
break;
}
case SWT.PaintItem:
{
TableItem item = (TableItem) event.item;
String text = item.getText(event.index);
Point size = event.gc.textExtent(text);
int offset2 = event.index == 0 ? Math.max(0, (event.height - size.y) / 2) : 0;
event.gc.drawText(text, event.x, event.y + offset2, true);
break;
}
case SWT.EraseItem:
{
event.detail &= ~SWT.FOREGROUND;
break;
}
}
};
table.addListener(SWT.MeasureItem, paintListener);
table.addListener(SWT.PaintItem, paintListener);
table.addListener(SWT.EraseItem, paintListener);
final TableEditor editor = new TableEditor(table);
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.grabVertical = true;
table.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
Control oldEditor = editor.getEditor();
if (oldEditor != null)
oldEditor.dispose();
TableItem item = (TableItem) e.item;
if (item == null)
return;
Text newEditor = new Text(table, SWT.WRAP | SWT.BORDER);
newEditor.setText(item.getText(1));
newEditor.addModifyListener(me ->
{
Text text = (Text) editor.getEditor();
editor.getItem().setText(1, text.getText());
// Redraw the table so that it'll adjust the row height
table.redraw();
// Wait a bit and then relayout the editor, so it'll move to the correct position
display.timerExec(100, editor::layout);
});
newEditor.selectAll();
newEditor.setFocus();
editor.setEditor(newEditor, item, 1);
}
});
for (int i = 0; i < 3; i++)
{
table.getColumn(i).pack();
}
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}