【问题标题】:Creating a JComboBox in a JTable with the dropdown always visible在 JTable 中创建 JComboBox,下拉菜单始终可见
【发布时间】:2014-08-19 20:07:20
【问题描述】:

在 Swing 中可以在 JTable 中创建 JComboBox,正如来自 Oracle 的 this guide 所见。他们有一张可爱的图片展示了这一点:

但是,无法显示的是,如果您没有单击单元格,则下拉箭头不可见,它看起来就像一个普通的文本标签,如下所示:

你可以看到 knitting 有下拉箭头,因为我只是点击了它,但其他的没有。遗憾的是,这不太理想,因为没有可以单击单元格以显示选项列表的视觉提示。换句话说,“运动”列看起来与“姓氏”列相同。其中一个是下拉菜单,另一个不是,但它们在视觉上看起来是一样的,除非您碰巧点击其中一个。

有什么方法可以在 Swing 中完成吗?

编辑:澄清一下,我想要的是“运动”列中的所有单元格都有指示下拉菜单的箭头,即使它们不是至少一次点击。基本上,无论我是否点击它,我都希望它看起来像一个组合框。

【问题讨论】:

  • 这是JTable的默认行为,渲染和编辑是两种不同的状态。就个人而言,您真的不想让 UI 中出现不需要的东西……但那就是我……
  • @MadProgrammer,在某些用例中,JTable 上的下拉列表可能很有用,如上面 Oracle 的示例所示。问题是您不知道该选项存在,因为在您单击它之前没有视觉线索。
  • 你没有抓住重点。在编辑模式下,Sport 列中的每个单元格都由一个组合框支持。渲染时,它们只是显示为“文本”
  • @MadProgrammer,我知道它在不处于编辑模式时仅显示为“文本”,而在编辑模式时显示为组合框。我想要的是它在两者中都显示为组合框。
  • 恕我直言,我认为你是在自找麻烦,但我知道什么;)

标签: java swing jtable jcombobox


【解决方案1】:

我不确定您是否理解 JTable 中“渲染器”和“编辑”模式之间的区别。在编辑模式下,您示例中 Sport 列中的所有单元格都由组合框支持。

我相信你正在尝试做的是......

这会使 UI 混乱(恕我直言)

因此,基于here 的示例,我修改了代码以更改Sport 列的默认单元格渲染器

public void setUpSportColumn(JTable table,
                TableColumn sportColumn) {
    //Set up the editor for the sport cells.
    JComboBox comboBox = new JComboBox();
    DefaultComboBoxModel model = new DefaultComboBoxModel();
    model.addElement("Snowboarding");
    model.addElement("Rowing");
    model.addElement("Knitting");
    model.addElement("Speed reading");
    model.addElement("Pool");
    model.addElement("None of the above");
    comboBox.setModel(model);
    sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

    model = new DefaultComboBoxModel();
    model.addElement("Snowboarding");
    model.addElement("Rowing");
    model.addElement("Knitting");
    model.addElement("Speed reading");
    model.addElement("Pool");
    model.addElement("None of the above");
    //Set up tool tips for the sport cells.
    ComboBoxTableCellRenderer renderer
                    = new ComboBoxTableCellRenderer();
    renderer.setModel(model);
    sportColumn.setCellRenderer(renderer);
}

并添加了这个...

public class ComboBoxTableCellRenderer extends JComboBox implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setSelectedItem(value);
        return this;
    }

}

【讨论】:

  • 如果增加行高,您认为 GUI 是否仍会显得杂乱无章?
  • 这只是我个人的意见,所以你需要自己做出决定,但是是的......可能会更好的是从组合框中删除边框以“打开”它小的。我会玩,看看我能完成什么
  • 感谢您对 ui 的意见。如果它不是这样显示的,用户将如何编辑它?我在想:在只读表右侧显示“编辑”的按钮,如果单击它,则仅打开该行的编辑器。你同意 ui 会更简单吗? (理论上)
  • 编辑会自动进行。 Table#isCellEditableTableCellEditor#isCellEditable 的组合一起工作,当它们都返回 true 时,单元格变为可编辑...另一个考虑因素(行高)是平台之间的差异,您需要设计一些方法通过它您可以在运行时计算这些行的合适高度
  • 谢谢!一旦我发现示例的最后两行从代码块中删除,我就可以让它工作。修复缩进并没有达到编辑的字符限制,所以我无法修复它。也许为了达到字数限制,您可以添加一些 cmets 来指出您添加了哪些行?另外,是否有第二次重新创建模型的原因?
【解决方案2】:

首先,你可能想看看这个:how to add checkbox and combobox in table cell?

在您的示例中,我认为这可能是由于没有足够的高度来显示 GUI。我的意思是 Swing 组件会自动调整大小以填充其容器,如果容器高度太小,则可能无法正确显示 GUI。

这里有一些图片来说明我的例子(我使用的是 Windows XP):

初始启动:

点击单元格:

单元格点击后:

【讨论】:

  • 我已经用图片更新了我的答案,以说明我对可调整大小的 Swing 组件的观点。
  • 感谢您的回答。不幸的是,我似乎并不清楚我在寻找什么。我遇到的问题是划船、针织、速读等没有可见的下拉箭头;在你的最后两张照片中只是单板滑雪。我已经编辑了我的问题以澄清这一点。
  • 箭头仅出现在用户选择的最后一个下拉项旁边。我认为这是 Swing 试图向用户展示他们上一次操作的“历史”的一种方式。有什么办法可以增加行的高度并再次测试吗? (我问的原因是因为“Snowboarding”这个词在底部被切断了导致我认为 ComboBox 没有足够的空间来正确显示)
  • JComboBox 使用基本的Window 作为弹出窗口,因此它不应该关心框架的大小,因为弹出窗口应该能够超出窗口的范围
  • @MadProgrammer:我认为问题不是在谈论下拉菜单的内容,我认为它是在谈论在用户单击之前显示的组合框的 UI,让用户知道它是一个组合框。
猜你喜欢
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2018-10-22
相关资源
最近更新 更多