在 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();
}