2016-11-30 118 views
1

條件: 我有關於SWT表格單元格的問題, 在此,我正在SWT表格單元格中寫入文本任何文本,然後我按下了鍵盤上的ENTER鍵。當我按下鍵時,文本以新行同一單元格開始。如何在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(); 
    } 
} 

屏幕截圖:enter image description here

這種產出要到SWT表。

+0

SWT表中的所有行具有相同的高度。你不能一行兩行,其餘行一行。 –

+0

@ greg-449:有什麼辦法,用新行開始文本? –

+0

[This](http://www.java2s.com/Tutorial/Java/0280__SWT/MultilineTablecell.htm)可能是一個起點。另外,使用[this](http://stackoverflow.com/questions/1688266/swt-cross-platform-enter-detection)來檢測回車鍵事件。 – Baz

回答

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(); 
} 
相關問題