条件:
     我有关于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();
   }
}


屏幕截图:java - 在SWT表单元格中按键盘键“ENTER”后如何开始新行?-LMLPHP

这种输出要到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();
}

08-05 16:40