トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

TableEditor

TableEditorはTableで表示しているデータを編集するためのクラスです。各セルに対して任意のウィジェットをエディタとして適用することができます。まずは、Tableで行を選択した場合に特定の列をTextウィジェットで編集する例を示します。

import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class TableTreeSample1 {
  
  public static void main (String [] args) {
    Display display = new Display ();
    Shell shell = new Shell(display);
    shell.setText("TableTree Sample 1");
    shell.setLayout(new FillLayout());
    
    // Tableウィジェットを生成
    final Table table = new Table(shell, SWT.BORDER|SWT.FULL_SELECTION);
    
    // カラムを設定
    String[] cols = {"名前","値"};
    for(int i=0;i<cols.length;i++){
      TableColumn col = new TableColumn(table,SWT.LEFT);
      col.setText(cols[i]);
      col.setWidth(100);
    }
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    
    // 行データを追加
    TableItem item1 = new TableItem(table,SWT.NULL);
    item1.setText(0,"Name");
    item1.setText(1,"Naoki Takezoe");
    
    TableItem item2 = new TableItem(table,SWT.NULL);
    item2.setText(0,"E-Mail");
    item2.setText(1,"takezoe@aa.bb-east.ne.jp");
    
    // TableEditorを生成
    final TableEditor tableEditor = new TableEditor(table);
    tableEditor.grabHorizontal = true;
    
    // Tableで行がクリックされた場合の処理
    table.addSelectionListener(new SelectionAdapter() {
      // インデックス=1のカラムを編集する
      private static final int EDIT_COLUMN = 1;
      
      public void widgetSelected(SelectionEvent e){
        int index = table.getSelectionIndex();
        if(index == -1){
          return;
        }
        // Tableの選択範囲を解除
        table.setSelection(new int[0]);
        // 選択された行のTableItemを取得
        TableItem item = table.getItem(index);
        // セルエディタを設定
        final Text text = new Text(table, SWT.NONE);
        text.setText(item.getText(EDIT_COLUMN));
        // フォーカスが外れたときの処理
        text.addFocusListener(new FocusAdapter(){
          public void focusLost(FocusEvent e){
            TableItem item = tableEditor.getItem();
            item.setText(EDIT_COLUMN,text.getText());
            text.dispose();
          }
        });
        tableEditor.setEditor (text, item, EDIT_COLUMN);
        text.setFocus();
        text.selectAll();
      }
    });
    
    // ウィンドウのサイズを指定
    shell.setSize(250,100);
    shell.open();
    while (!shell.isDisposed ()){
      if (!display.readAndDispatch ()){
        display.sleep ();
      }
    }
    display.dispose ();
  }
}

上記のコードを実行すると以下のようになります。

この例ではセルを編集中のTextウィジェットからフォーカスが外れた時点でTableItemのテキストを再設定しています。ENTERキーで入力値の決定、ESCキーで編集のキャンセルができるようにしてみましょう。セルの編集に使用するTextウィジェットに対して以下のKeyListenerを追加します。

// ENTERとESCが押されたときの処理
text.addKeyListener(new KeyAdapter(){
  public void keyReleased(KeyEvent e){
    if(e.character==SWT.CR){
      TableItem item = tableEditor.getItem();
      item.setText(EDIT_COLUMN,text.getText());
      text.dispose();
    } else if(e.keyCode==SWT.ESC){
      text.dispose();
    }
  }
});

上記の例では編集する列は固定でしたが、クリックした任意のセルを編集したい場合もあると思います。この場合は少々面倒ですが、自前でクリックされたセルを検出する処理を記述する必要があります。Tableに対して設定しているSelectionListenerの代わりに以下のようにMouseListenerを追加します。

 table.addMouseListener (new MouseAdapter() {
   public void mouseDown(MouseEvent e){
   
   int index = table.getSelectionIndex();
   if(index == -1){
     return;
   }
   table.setSelection(new int[0]);
   TableItem item = table.getItem(index);
   Point point = new Point (e.x, e.y);
   
   for (int i=0;i < table.getColumnCount();i++) {
     // 選択された座標がセル領域に含まれているかを判定
     if (item.getBounds(i).contains (point)) {
       final int column = i;
       final Text text = new Text(table, SWT.NONE);
       text.setText(item.getText(i));
       text.addFocusListener(new FocusAdapter(){
         public void focusLost(FocusEvent e){
           TableItem item = tableEditor.getItem();
           item.setText(column,text.getText());
           text.dispose();
         }
       });
       tableEditor.setEditor (text, item, i);
       text.setFocus();
      text.selectAll();
     }
   }
});

最終更新時間:2004年09月02日 14時04分36秒