按键盘键后如何开始新行是" ENTER"在SWT表格单元格?

时间:2016-11-30 05:24:55

标签: java swt eclipse-rcp keyboard-events

条件:      我有关于SWT表格单元的问题,      在此,我在SWT表格单元格中写入任何文本文本,然后按下键盘输入键。当我按下键时,文本以新行相同的单元格开始。

问题:  这个关键事件(键盘" 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();
   }
}

屏幕截图:enter image description here

这种输出想要进入SWt表。

1 个答案:

答案 0 :(得分:1)

好吧,我试了一下,这真是个蠢事。我设法使其按以下方式工作:只要编辑器的内容发生变化,就会调用表的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();
}