トップ 一覧 検索 ヘルプ 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 ();
   }
 }

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

{{ref_image TableEditorSample1.png}}

この例ではセルを編集中の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();
       text.selectAll();
      }
    }
  }
 });