使用表格单元格中的组件,而不只是字符串

时间:2014-09-20 12:15:18

标签: java swing jtable tablecelleditor

如何将组件用作单元格内容,而不仅仅是字符串,布尔值和整数。

String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
String[] columnNames = {"name", "elem"};
Object[][] data = {
    {"button", new JButton("test")},
    {"select", new JComboBox(petStrings)}
};

JTable table = new JTable(data, columnNames);

现在我看不到按钮和表格中的组合框只有javax.swing.JComboBox...

也许我应该以某种方式扩展JTable,但我不知道如何。

1 个答案:

答案 0 :(得分:2)

阅读JTable tutorial。了解您已经在JTable单元格中使用了类的组件。显示时,JTable 呈现一个TableCellRenderer,一个必须返回每个单元格显示的Component的对象。当编辑单元格时,JTable将显示(通常)不同的对象,即由TableCellEditor生成的组件。那么你的工作就是改变你的表格的渲染器和/或编辑器,这取决于你的需要,其步骤太长而不能简单地在这个答案中显示。再次,教程将为您指明方向。

请注意,无论您在解决方案中采用何种路线,JTable的单元格渲染器都不会显示任何实际组件,而只会显示组件的渲染,这是一个很大的区别。然而,单元格编辑器显示实际组件,但仅在单元格处于编辑状态时才会显示。

除此之外,该表用作数据的表格式表示,通常,每列中都显示相同的类型数据,因此您&# 39; d必须提出一个强有力的论据来说服我有一个JTable列,有时显示一个JButton,有时候显示一个JComboBox。

例如,要让一个JTable列的编辑器显示一个组合框,您可以将其默认单元格编辑器设置为使用组合框,如下所示:

  String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
  JComboBox<String> petCombo = new JComboBox<>(petStrings);
  String[] columnNames = {"name", "elem"};
  Object[][] data = {
      {"Pet 1", null},
      {"Pet 2", null}
  };

  DefaultTableModel model = new DefaultTableModel(data, columnNames);
  JTable table = new JTable(model);
  table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(petCombo));