原文: http://zetcode.com/gui/javaswt/table/

在 Java SWT 教程的这一部分中,我们介绍Table小部件。 Table是细胞的二维网格。 可以将数据写入这些单元中的每一个中。 该小部件由电子表格应用引入。

Table可以显示列标题,并且当单元格很多时,Table可以显示滚动条。

空表

第一个示例创建一个简单的空表。

TableEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.layout.GridData;
  4. import org.eclipse.swt.layout.GridLayout;
  5. import org.eclipse.swt.widgets.Display;
  6. import org.eclipse.swt.widgets.Shell;
  7. import org.eclipse.swt.widgets.Table;
  8. import org.eclipse.swt.widgets.TableColumn;
  9. import org.eclipse.swt.widgets.TableItem;
  10. /**
  11. * ZetCode Java SWT tutorial
  12. *
  13. * In this program, we create a simple, empty
  14. * table widget.
  15. *
  16. * Author: Jan Bodnar
  17. * Website: zetcode.com
  18. * Last modified: June 2015
  19. */
  20. public class TableEx {
  21. public TableEx(Display display) {
  22. initUI(display);
  23. }
  24. @SuppressWarnings("unused")
  25. private void initUI(Display display) {
  26. Shell shell = new Shell(display);
  27. shell.setLayout(new GridLayout());
  28. Table table = new Table(shell, SWT.BORDER);
  29. table.setHeaderVisible(true);
  30. table.setLinesVisible(true);
  31. GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
  32. data.heightHint = 300;
  33. data.widthHint = 350;
  34. table.setLayoutData(data);
  35. String[] titles = { "A", "B", "C" };
  36. for (int i = 0; i < titles.length; i++) {
  37. TableColumn column = new TableColumn(table, SWT.CENTER);
  38. column.setWidth(120);
  39. column.setText(titles[i]);
  40. }
  41. for (int i = 0; i < 15; i++) {
  42. TableItem item = new TableItem(table, SWT.NONE);
  43. }
  44. shell.setText("Empty table");
  45. shell.pack();
  46. shell.open();
  47. while (!shell.isDisposed()) {
  48. if (!display.readAndDispatch())
  49. display.sleep();
  50. }
  51. }
  52. @SuppressWarnings("unused")
  53. public static void main(String[] args) {
  54. Display display = new Display();
  55. TableEx ex = new TableEx(display);
  56. display.dispose();
  57. }
  58. }

该代码示例创建一个具有三列和十五行的表小部件。 表单元为空。

  1. Table table = new Table(shell, SWT.BORDER);

创建Table小部件的实例。

  1. table.setHeaderVisible(true);

setHeaderVisible()使表格标题可见。 标题由表列名称组成。

  1. table.setLinesVisible(true);

setLinesVisible()显示表格单元格的边框。 默认情况下,单元格不可见。

  1. String[] titles = { "A", "B", "C" };

这些是列标题。

  1. for (int i = 0; i < titles.length; i++) {
  2. TableColumn column = new TableColumn(table, SWT.CENTER);
  3. column.setWidth(120);
  4. column.setText(titles[i]);
  5. }

在此for循环中,我们创建表列。 TableColumn的实例表示表窗口小部件中的一列。 setWidth()设置列的宽度,setText()方法设置列的名称。

  1. for (int i = 0; i < 15; i++) {
  2. TableItem item = new TableItem(table, SWT.NONE);
  3. }

TableItem代表表中的一行。 这段代码创建了十五个空单元格。

`Table`小部件 - 图1

图:空表

用数据填充单元格

在第二个示例中,表格单元格显示一些数据。

TableEx2.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.layout.FillLayout;
  4. import org.eclipse.swt.widgets.Display;
  5. import org.eclipse.swt.widgets.Shell;
  6. import org.eclipse.swt.widgets.Table;
  7. import org.eclipse.swt.widgets.TableColumn;
  8. import org.eclipse.swt.widgets.TableItem;
  9. /**
  10. * ZetCode Java SWT tutorial
  11. *
  12. * In this program, we fill table cells
  13. * with data.
  14. *
  15. * Author: Jan Bodnar
  16. * Website: zetcode.com
  17. * Last modified: June 2015
  18. */
  19. public class TableEx2 {
  20. public TableEx2(Display display) {
  21. initUI(display);
  22. }
  23. private void initUI(Display display) {
  24. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  25. shell.setLayout(new FillLayout());
  26. Table table = new Table(shell, SWT.BORDER);
  27. table.setHeaderVisible(true);
  28. table.setLinesVisible(true);
  29. TableColumn tc1 = new TableColumn(table, SWT.CENTER);
  30. TableColumn tc2 = new TableColumn(table, SWT.CENTER);
  31. TableColumn tc3 = new TableColumn(table, SWT.CENTER);
  32. tc1.setText("First Name");
  33. tc2.setText("Last Name");
  34. tc3.setText("Profession");
  35. tc1.setWidth(70);
  36. tc2.setWidth(70);
  37. tc3.setWidth(80);
  38. TableItem item1 = new TableItem(table, SWT.NONE);
  39. item1.setText(new String[] { "Jane", "Brown", "Accountant" });
  40. TableItem item2 = new TableItem(table, SWT.NONE);
  41. item2.setText(new String[] { "Tim", "Warner", "Lawyer" });
  42. TableItem item3 = new TableItem(table, SWT.NONE);
  43. item3.setText(new String[] { "Bob", "Milton", "Police officer" });
  44. shell.setText("Table widget");
  45. shell.pack();
  46. shell.open();
  47. while (!shell.isDisposed()) {
  48. if (!display.readAndDispatch())
  49. display.sleep();
  50. }
  51. }
  52. @SuppressWarnings("unused")
  53. public static void main(String[] args) {
  54. Display display = new Display();
  55. TableEx2 ex = new TableEx2(display);
  56. display.dispose();
  57. }
  58. }

该示例显示了具有三列三行的表格小部件。 单元格充满数据。

  1. TableItem item1 = new TableItem(table, SWT.NONE);
  2. item1.setText(new String[] { "Jane", "Brown", "Accountant" });

setText()方法用数据填充一行的所有三个单元格。

`Table`小部件 - 图2

图:带有数据的表格单元

选择表格行

以下示例介绍了表格项目的选择。

TableEx3.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.layout.GridData;
  4. import org.eclipse.swt.layout.GridLayout;
  5. import org.eclipse.swt.widgets.Display;
  6. import org.eclipse.swt.widgets.Label;
  7. import org.eclipse.swt.widgets.Shell;
  8. import org.eclipse.swt.widgets.Table;
  9. import org.eclipse.swt.widgets.TableColumn;
  10. import org.eclipse.swt.widgets.TableItem;
  11. /**
  12. * ZetCode Java SWT tutorial
  13. *
  14. * In this program, we show the data from
  15. * the selected row in the statusbar.
  16. *
  17. * Author: Jan Bodnar
  18. * Website: zetcode.com
  19. * Last modified: June 2015
  20. */
  21. public class TableEx3 {
  22. private Label label;
  23. private final String data[][] = { { "Ferarri", "33333" },
  24. { "Skoda", "22000" }, { "Volvo", "18000" }, { "Mazda", "15000" },
  25. { "Mercedes", "38000" } };
  26. public TableEx3(Display display) {
  27. initUI(display);
  28. }
  29. private void initUI(Display display) {
  30. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  31. shell.setLayout(new GridLayout(1, true));
  32. Table table = new Table(shell, SWT.BORDER);
  33. table.setHeaderVisible(true);
  34. table.setLinesVisible(true);
  35. String[] titles = { "Car", "Price" };
  36. for (int i = 0; i & titles.length; i++) {
  37. TableColumn column = new TableColumn(table, SWT.NULL);
  38. column.setText(titles[i]);
  39. column.setWidth(130);
  40. }
  41. for (int i = 0; i & data.length; i++) {
  42. TableItem item = new TableItem(table, SWT.NULL);
  43. item.setText(0, data[i][0]);
  44. item.setText(1, data[i][1]);
  45. }
  46. label = new Label(shell, SWT.NONE);
  47. table.addListener(SWT.Selection, event -> onTableItemSelected(table));
  48. GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
  49. gd.widthHint = 360;
  50. gd.heightHint = 300;
  51. table.setLayoutData(gd);
  52. label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
  53. shell.setText("Table widget");
  54. shell.pack();
  55. shell.open();
  56. while (!shell.isDisposed()) {
  57. if (!display.readAndDispatch())
  58. display.sleep();
  59. }
  60. }
  61. private void onTableItemSelected(Table table) {
  62. TableItem[] sel = table.getSelection();
  63. String msg = String.format("%s: %s", sel[0].getText(0),
  64. sel[0].getText(1));
  65. label.setText(msg);
  66. }
  67. @SuppressWarnings("unused")
  68. public static void main(String[] args) {
  69. Display display = new Display();
  70. TableEx3 ex = new TableEx3(display);
  71. display.dispose();
  72. }
  73. }

在示例中,所选行中的数据显示在状态栏中。

  1. table.addListener(SWT.Selection, event -> onTableItemSelected(table));

选择监听器将添加到表中。 每当选择表格项目时,都会调用onTableItemSelected()

  1. private void onTableItemSelected(Table table) {
  2. TableItem[] sel = table.getSelection();
  3. String msg = String.format("%s: %s", sel[0].getText(0),
  4. sel[0].getText(1));
  5. label.setText(msg);
  6. }

getSelection()方法返回一个选定表项的数组。 (由于我们使用默认选择模式(即单选模式),因此仅返回一个表项。)我们使用getText()方法从该行的单元格中检索数据。 我们构建消息并使用其setText()方法将其显示在标签中。

`Table`小部件 - 图3

图:选择表项

添加新表项

在以下示例中,新表项被动态添加到表中。

TableEx4.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.layout.GridData;
  4. import org.eclipse.swt.layout.GridLayout;
  5. import org.eclipse.swt.widgets.Button;
  6. import org.eclipse.swt.widgets.Display;
  7. import org.eclipse.swt.widgets.Event;
  8. import org.eclipse.swt.widgets.Label;
  9. import org.eclipse.swt.widgets.Shell;
  10. import org.eclipse.swt.widgets.Table;
  11. import org.eclipse.swt.widgets.TableColumn;
  12. import org.eclipse.swt.widgets.TableItem;
  13. import org.eclipse.swt.widgets.Text;
  14. /**
  15. * ZetCode Java SWT tutorial
  16. *
  17. * In this program, we add new table items
  18. * to the table.
  19. *
  20. * Author: Jan Bodnar
  21. * Website: zetcode.com
  22. * Last modified: June 2015
  23. */
  24. public class TableEx4 {
  25. private Text text1;
  26. private Text text2;
  27. private Table table;
  28. private final String data[][] = { { "Ferarri", "33333" },
  29. { "Skoda", "22000" }, { "Volvo", "18000" }, { "Mazda", "15000" },
  30. { "Mercedes", "38000" } };
  31. public TableEx4(Display display) {
  32. initUI(display);
  33. }
  34. private void initUI(Display display) {
  35. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  36. shell.setLayout(new GridLayout(5, false));
  37. table = new Table(shell, SWT.BORDER | SWT.MULTI);
  38. table.setHeaderVisible(true);
  39. // table.setLinesVisible(true);
  40. String[] titles = { "Car", "Price" };
  41. for (int i = 0; i < titles.length; i++) {
  42. TableColumn column = new TableColumn(table, SWT.NULL);
  43. column.setText(titles[i]);
  44. column.setWidth(130);
  45. }
  46. for (int i = 0; i < data.length; i++) {
  47. TableItem item = new TableItem(table, SWT.NULL);
  48. item.setText(0, data[i][0]);
  49. item.setText(1, data[i][1]);
  50. }
  51. GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
  52. gd.horizontalSpan = 5;
  53. gd.widthHint = 360;
  54. gd.heightHint = 300;
  55. table.setLayoutData(gd);
  56. Label carName = new Label(shell, SWT.NONE);
  57. carName.setText("Car:");
  58. text1 = new Text(shell, SWT.BORDER);
  59. Label priceOfCar = new Label(shell, SWT.NONE);
  60. priceOfCar.setText("Price:");
  61. text2 = new Text(shell, SWT.BORDER);
  62. text1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
  63. text2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
  64. Button addBtn = new Button(shell, SWT.PUSH);
  65. addBtn.setText("Insert");
  66. addBtn.addListener(SWT.Selection, event -> onInsertButtonSelected(event));
  67. shell.setText("Table widget");
  68. shell.pack();
  69. shell.open();
  70. while (!shell.isDisposed()) {
  71. if (!display.readAndDispatch())
  72. display.sleep();
  73. }
  74. }
  75. private void onInsertButtonSelected(Event event) {
  76. String val1 = text1.getText();
  77. String val2 = text2.getText();
  78. if (val1.isEmpty() || val2.isEmpty()) {
  79. return;
  80. }
  81. TableItem item = new TableItem(table, SWT.NULL);
  82. item.setText(0, val1);
  83. item.setText(1, val2);
  84. text1.setText("");
  85. text2.setText("");
  86. }
  87. @SuppressWarnings("unused")
  88. public static void main(String[] args) {
  89. Display display = new Display();
  90. TableEx4 ex = new TableEx4(display);
  91. display.dispose();
  92. }
  93. }

在底部,有两个文本小部件和一个按钮。 插入到文本小部件中的数据将插入到新表项的单元格中。

  1. private void onInsertButtonSelected(Event event) {
  2. String val1 = text1.getText();
  3. String val2 = text2.getText();
  4. ...
  5. }

onInsertButtonSelected()方法中,我们从文本小部件中获取插入的文本。

  1. if (val1.isEmpty() || val2.isEmpty()) {
  2. return;
  3. }

我们确保文本小部件不为空。

  1. TableItem item = new TableItem(table, SWT.NULL);
  2. item.setText(0, val1);
  3. item.setText(1, val2);

构造新表项,并获取插入的数据。

  1. text1.setText("");
  2. text2.setText("");

最后,将清除文本小部件。

`Table`小部件 - 图4

图:添加新表项

在 Java SWT 教程的这一部分中,我们介绍了Table小部件。