Java Tutorial/SWT/Table Editor

Материал из Java эксперт
Перейти к: навигация, поиск

Add action listener to Table Button Cell Editor

   <source lang="java">

import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.ColorDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; public class TableEditorButtonActionListener {

 public static void main(String[] args) {
   Display display = new Display();
   final Shell shell = new Shell(display);
   shell.setText("Text Table Editor");
   shell.setLayout(new FillLayout());
   final Table table = new Table(shell, SWT.SINGLE | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
   table.setHeaderVisible(true);
   table.setLinesVisible(true);
   for (int i = 0; i < 5; i++) {
     TableColumn column = new TableColumn(table, SWT.CENTER);
     column.setText("Column " + (i + 1));
     column.pack();
   }
   // Create five table editors for color
   TableEditor[] colorEditors = new TableEditor[5];
   // Create five buttons for changing color
   Button[] colorButtons = new Button[5];
   for (int i = 0; i < 5; i++) {
     final TableItem item = new TableItem(table, SWT.NONE);
     colorEditors[i] = new TableEditor(table);
     colorButtons[i] = new Button(table, SWT.PUSH);
     colorButtons[i].setText("Color...");
     colorButtons[i].ruputeSize(SWT.DEFAULT, table.getItemHeight());
     colorEditors[i].grabHorizontal = true;
     colorEditors[i].minimumHeight = colorButtons[i].getSize().y;
     colorEditors[i].minimumWidth = colorButtons[i].getSize().x;
     colorEditors[i].setEditor(colorButtons[i], item, 0);
     
     colorButtons[i].addSelectionListener(new SelectionAdapter() {
       public void widgetSelected(SelectionEvent event) {
         ColorDialog dialog = new ColorDialog(shell);
         RGB rgb = dialog.open();
         if (rgb != null) {
           table.setBackground(new Color(shell.getDisplay(), rgb));
         }
       }
     });      
   }
   shell.pack();
   shell.open();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       display.sleep();
     }
   }
   display.dispose();
 }

}</source>





Add selection listener to TableCursor

   <source lang="java">

import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ControlEditor; import org.eclipse.swt.custom.TableCursor; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; public class TableCursorListenerSelection {

 public static void main(String[] args) {
   Display display = new Display();
   Shell shell = new Shell(display);
   shell.setText("Table Cursor Test");
   shell.setLayout(new FillLayout());
   final Table table = new Table(shell, SWT.SINGLE | SWT.FULL_SELECTION);
   table.setHeaderVisible(true);
   table.setLinesVisible(true);
   for (int i = 0; i < 5; i++) {
     TableColumn column = new TableColumn(table, SWT.CENTER);
     column.setText("Column " + (i + 1));
     column.pack();
   }
   for (int i = 0; i < 5; i++) {
     new TableItem(table, SWT.NONE);
   }
   final TableCursor cursor = new TableCursor(table, SWT.NONE);
   final ControlEditor editor = new ControlEditor(cursor);
   editor.grabHorizontal = true;
   editor.grabVertical = true;
   cursor.addSelectionListener(new SelectionAdapter() {
     // This is called as the user navigates around the table
     public void widgetSelected(SelectionEvent event) {
       // Select the row in the table where the TableCursor is
       table.setSelection(new TableItem[] { cursor.getRow() });
     }
     // This is called when the user hits Enter
     public void widgetDefaultSelected(SelectionEvent event) {
       final Text text = new Text(cursor, SWT.NONE);
       text.setFocus();
       // Copy the text from the cell to the Text control
       text.setText(cursor.getRow().getText(cursor.getColumn()));
       text.setFocus();
       // Add a handler to detect key presses
       text.addKeyListener(new KeyAdapter() {
         public void keyPressed(KeyEvent event) {
           switch (event.keyCode) {
           case SWT.CR:
             cursor.getRow().setText(cursor.getColumn(), text.getText());
           case SWT.ESC:
             text.dispose();
             break;
           }
         }
       });
       editor.setEditor(text);
     }
   });
   shell.pack();
   shell.open();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       display.sleep();
     }
   }
   display.dispose();
 }

}</source>





Edit the text of a table item (in place)

   <source lang="java">

/*******************************************************************************

* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/

//package org.eclipse.swt.snippets; /*

* TableEditor example snippet: edit the text of a table item (in place)
*
* For a list of all SWT example snippets see
* http://www.eclipse.org/swt/snippets/
*/

import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; public class TableItemEditor {

 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);
   // The editor must have the same size as the cell and must
   // not be any smaller than 50 pixels.
   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();
 }

}</source>





Install Table Editor when navigating the Table Cursor

   <source lang="java">

import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ControlEditor; import org.eclipse.swt.custom.TableCursor; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; public class TableCursorTableEditor {

 public static void main(String[] args) {
   Display display = new Display();
   Shell shell = new Shell(display);
   shell.setText("Table Cursor Test");
   shell.setLayout(new FillLayout());
   final Table table = new Table(shell, SWT.SINGLE | SWT.FULL_SELECTION);
   table.setHeaderVisible(true);
   table.setLinesVisible(true);
   for (int i = 0; i < 5; i++) {
     TableColumn column = new TableColumn(table, SWT.CENTER);
     column.setText("Column " + (i + 1));
     column.pack();
   }
   for (int i = 0; i < 5; i++) {
     new TableItem(table, SWT.NONE);
   }
   final TableCursor cursor = new TableCursor(table, SWT.NONE);
   final ControlEditor editor = new ControlEditor(cursor);
   editor.grabHorizontal = true;
   editor.grabVertical = true;
   cursor.addSelectionListener(new SelectionAdapter() {
     // This is called as the user navigates around the table
     public void widgetSelected(SelectionEvent event) {
       // Select the row in the table where the TableCursor is
       table.setSelection(new TableItem[] { cursor.getRow() });
     }
     // This is called when the user hits Enter
     public void widgetDefaultSelected(SelectionEvent event) {
       final Text text = new Text(cursor, SWT.NONE);
       text.setFocus();
       // Copy the text from the cell to the Text control
       text.setText(cursor.getRow().getText(cursor.getColumn()));
       text.setFocus();
       // Add a handler to detect key presses
       text.addKeyListener(new KeyAdapter() {
         public void keyPressed(KeyEvent event) {
           switch (event.keyCode) {
           case SWT.CR:
             cursor.getRow().setText(cursor.getColumn(), text.getText());
           case SWT.ESC:
             text.dispose();
             break;
           }
         }
       });
       editor.setEditor(text);
     }
   });
   shell.pack();
   shell.open();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       display.sleep();
     }
   }
   display.dispose();
 }

}</source>





Placing the Text Editor after mouse click and exchange data between table cell and editor

   <source lang="java">

import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; public class TableEditorMouseClickText {

 public static void main(String[] args) {
   Display display = new Display();
   final Shell shell = new Shell(display);
   shell.setText("Text Table Editor");
   shell.setLayout(new FillLayout());
   final Table table = new Table(shell, SWT.SINGLE | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
   table.setHeaderVisible(true);
   table.setLinesVisible(true);
   for (int i = 0; i < 5; i++) {
     TableColumn column = new TableColumn(table, SWT.CENTER);
     column.setText("Column " + (i + 1));
     column.pack();
   }
   for (int i = 0; i < 5; i++) {
     final TableItem item = new TableItem(table, SWT.NONE);
   }
   final TableEditor editor = new TableEditor(table);
   editor.horizontalAlignment = SWT.LEFT;
   editor.grabHorizontal = true;
   table.addMouseListener(new MouseAdapter() {
     public void mouseDown(MouseEvent event) {
       Control old = editor.getEditor();
       if (old != null)
         old.dispose();
       Point pt = new Point(event.x, event.y);
       final TableItem item = table.getItem(pt);
       if (item == null) {
         return;
       }
       int column = -1;
       for (int i = 0, n = table.getColumnCount(); i < n; i++) {
         Rectangle rect = item.getBounds(i);
         if (rect.contains(pt)) {
           column = i;
           break;
         }
       }
       if (column != 1) {
         return;
       }
       final Text text = new Text(table, SWT.NONE);
       text.setForeground(item.getForeground());
       text.setText(item.getText(column));
       text.setForeground(item.getForeground());
       text.selectAll();
       text.setFocus();
       editor.minimumWidth = text.getBounds().width;
       editor.setEditor(text, item, column);
       final int col = column;
       text.addModifyListener(new ModifyListener() {
         public void modifyText(ModifyEvent event) {
           item.setText(col, text.getText());
         }
       });
     }
   });
   shell.pack();
   shell.open();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch()) {
       display.sleep();
     }
   }
   display.dispose();
 }

}</source>





Table Cell Editor: Combo, Text and Button

   <source lang="java">

/*******************************************************************************

* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/

//package org.eclipse.swt.snippets; /*

* Table example snippet: place arbitrary controls in a table
*
* For a list of all SWT example snippets see
* http://www.eclipse.org/swt/snippets/
*/

import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; public class TableCellEditorComboTextButton {

 public static void main(String[] args) {
   Display display = new Display();
   Shell shell = new Shell(display);
   shell.setLayout(new FillLayout());
   Table table = new Table(shell, SWT.BORDER | SWT.MULTI);
   table.setLinesVisible(true);
   for (int i = 0; i < 3; i++) {
     TableColumn column = new TableColumn(table, SWT.NONE);
     column.setWidth(100);
   }
   for (int i = 0; i < 12; i++) {
     new TableItem(table, SWT.NONE);
   }
   TableItem[] items = table.getItems();
   for (int i = 0; i < items.length; i++) {
     TableEditor editor = new TableEditor(table);
     CCombo combo = new CCombo(table, SWT.NONE);
     combo.setText("CCombo");
     combo.add("item 1");
     combo.add("item 2");
     editor.grabHorizontal = true;
     editor.setEditor(combo, items[i], 0);
     editor = new TableEditor(table);
     Text text = new Text(table, SWT.NONE);
     text.setText("Text");
     editor.grabHorizontal = true;
     editor.setEditor(text, items[i], 1);
     editor = new TableEditor(table);
     Button button = new Button(table, SWT.CHECK);
     button.pack();
     editor.minimumWidth = button.getSize().x;
     editor.horizontalAlignment = SWT.LEFT;
     editor.setEditor(button, items[i], 2);
   }
   shell.pack();
   shell.open();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch())
       display.sleep();
   }
   display.dispose();
 }

}</source>





TableEditor: tab and escape event

   <source lang="java">

/*******************************************************************************

* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/

//package org.eclipse.swt.snippets; /*

* TableEditor example snippet: edit a cell in a table (in place, fancy)
* 
* For a list of all SWT example snippets see
* http://www.eclipse.org/swt/snippets/
*/

import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; public class TableEditorTabEscapeEvent{

 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.BORDER | SWT.MULTI);
   table.setLinesVisible(true);
   for (int i = 0; i < 3; i++) {
     TableColumn column = new TableColumn(table, SWT.NONE);
     column.setWidth(100);
   }
   for (int i = 0; i < 3; i++) {
     TableItem item = new TableItem(table, SWT.NONE);
     item.setText(new String[] { "" + i, "" + i, "" + i });
   }
   final TableEditor editor = new TableEditor(table);
   editor.horizontalAlignment = SWT.LEFT;
   editor.grabHorizontal = true;
   table.addListener(SWT.MouseDown, new Listener() {
     public void handleEvent(Event event) {
       Rectangle clientArea = table.getClientArea();
       Point pt = new Point(event.x, event.y);
       int index = table.getTopIndex();
       while (index < table.getItemCount()) {
         boolean visible = false;
         final TableItem item = table.getItem(index);
         for (int i = 0; i < table.getColumnCount(); i++) {
           Rectangle rect = item.getBounds(i);
           if (rect.contains(pt)) {
             final int column = i;
             final Text text = new Text(table, SWT.NONE);
             Listener textListener = new Listener() {
               public void handleEvent(final Event e) {
                 switch (e.type) {
                 case SWT.FocusOut:
                   item.setText(column, text.getText());
                   text.dispose();
                   break;
                 case SWT.Traverse:
                   switch (e.detail) {
                   case SWT.TRAVERSE_RETURN:
                     item.setText(column, text.getText());
                   // FALL THROUGH
                   case SWT.TRAVERSE_ESCAPE:
                     text.dispose();
                     e.doit = false;
                   }
                   break;
                 }
               }
             };
             text.addListener(SWT.FocusOut, textListener);
             text.addListener(SWT.Traverse, textListener);
             editor.setEditor(text, item, i);
             text.setText(item.getText(i));
             text.selectAll();
             text.setFocus();
             return;
           }
           if (!visible && rect.intersects(clientArea)) {
             visible = true;
           }
         }
         if (!visible)
           return;
         index++;
       }
     }
   });
   shell.pack();
   shell.open();
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch())
       display.sleep();
   }
   display.dispose();
 }

}</source>





Using TableEditor

  1. TableEditor derives from ControlEditor.
  2. TableEditor belongs to a cell.
  3. Use the setters for row and column to set the cell, like this:



   <source lang="java">

TableEditor editor = new TableEditor(myTable); editor.setEditor(myControl); editor.setItem(myItem); editor.setColumn(myColumn);</source>