在 SWT table 单元格中按下键盘键 "ENTER" 后如何开始换行?
How to start new line after press keyboard key is "ENTER" in SWT table cell?
条件:
我对 SWT table 单元格有疑问,
在此,我在 SWT table 单元格中编写任何文本文本,然后在我按下键盘 ENTER 键之后。当我按下键时,文本从同一单元格的新行开始。
问题:
此关键事件(键盘 "ENTER" 键)在同一单元格中开始换行的代码是什么?
此处,SWTtable示例代码:
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中table。
好吧,我试了一下,这真的是一件很麻烦的事情。我设法通过以下方式使其工作:只要编辑器的内容发生变化,就会调用 table 的 redraw()
方法(如果 table 很大,这会很昂贵) .这将保证 table 始终显示正确的项目(行)高度。我还补充说,每次更改都会调用编辑器的 layout()
方法,以便在行高发生变化并且您当前正在编辑的项目在 [=17= 中上下移动时重新定位](由项目高度变化引起)。
这绝不是一个好的或好的解决方案,但它可以完成工作。也许您可以对其进行微调并做出一些改进。
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("Whosebug");
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();
}
条件: 我对 SWT table 单元格有疑问, 在此,我在 SWT table 单元格中编写任何文本文本,然后在我按下键盘 ENTER 键之后。当我按下键时,文本从同一单元格的新行开始。
问题: 此关键事件(键盘 "ENTER" 键)在同一单元格中开始换行的代码是什么?
此处,SWTtable示例代码:
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中table。
好吧,我试了一下,这真的是一件很麻烦的事情。我设法通过以下方式使其工作:只要编辑器的内容发生变化,就会调用 table 的 redraw()
方法(如果 table 很大,这会很昂贵) .这将保证 table 始终显示正确的项目(行)高度。我还补充说,每次更改都会调用编辑器的 layout()
方法,以便在行高发生变化并且您当前正在编辑的项目在 [=17= 中上下移动时重新定位](由项目高度变化引起)。
这绝不是一个好的或好的解决方案,但它可以完成工作。也许您可以对其进行微调并做出一些改进。
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("Whosebug");
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();
}