Java 在JTable中创建一个JComboBox,下拉列表始终可见

Java 在JTable中创建一个JComboBox,下拉列表始终可见,java,swing,jtable,jcombobox,Java,Swing,Jtable,Jcombobox,在Swing中,可以在JTable中创建JComboBox,如Oracle中的所示。他们有一张可爱的照片,展示了这一点: 但是,未能显示的是,如果您没有单击单元格,则下拉箭头不可见,它看起来就像一个普通的文本标签,如下所示: 你可以看到编织有下拉箭头,因为我刚刚点击了它,但其他的没有。令人遗憾的是,这并不理想,因为没有可视提示可以单击单元格显示选项列表。换句话说,“运动”列与“姓氏”列看起来完全相同。其中一个是下拉列表,另一个不是,但它们在视觉上看起来是一样的,除非你碰巧点击其中一个 有没有

在Swing中,可以在JTable中创建JComboBox,如Oracle中的所示。他们有一张可爱的照片,展示了这一点:

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

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

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


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

首先,您可能想查看以下内容:

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

下面的图片演示了我的示例(我使用的是Windows XP):

首次发布:

单击单元格:

单击单元格后:


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

我相信你想做的是

这将扰乱用户界面(IMHO)

因此,基于中的示例,我修改了代码以更改
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;
    }

}

我已经用图片更新了我的答案,以说明我关于可调整大小的Swing组件的观点。谢谢你的回答。不幸的是,我似乎不太清楚我在寻找什么。我遇到的问题是划船、编织、速读等都没有一个可见的下拉箭头;在你的前两张照片中,只是滑雪板。我编辑了我的问题以澄清这一点。箭头仅显示在用户选择的最后一个下拉项旁边。我认为这是Swing试图向用户显示其上一次操作的“历史”的一种方式。有没有办法增加行的高度并再次测试?(我之所以问这个问题,是因为“滑雪板”这个词在底部被切掉了,这让我觉得ComboBox没有足够的空间来正确显示)
JComboBox
使用一个基本的
窗口作为弹出窗口,所以它不应该关心框架的大小,因为弹出窗口应该能够扩展到window@MadProgrammer:我不认为问题是关于下拉列表的内容,我认为它是关于在用户单击组合框之前显示的组合框UI,让用户知道它是一个组合框。这是
JTable
的默认行为,渲染和编辑是两种不同的状态。就个人而言,你真的不想用不需要的东西把UI弄得乱七八糟…但那是我…@MadProgrammer,在某些用例中,JTable上的下拉列表可能很有用,正如上面Oracle的示例所示。问题是你不知道这个选项在那里,因为在你点击它之前没有任何视觉线索。你错过了要点。在编辑模式下,
Sport
列中的每个单元格后面都有一个组合框。渲染时,它们只是显示为“text”@MadProgrammer,我知道它在不处于编辑模式时只是显示为“text”,在处于编辑模式时是一个组合框。我想要的是它在两个页面中都显示为一个组合框。嗯,我想你是在自找麻烦,但我知道什么;)您认为如果增加行高,GUI是否仍会显得杂乱无章?这只是我个人的观点,因此您需要自己做出决定,但是的……可能会更好的方法是从组合框中删除边框以“打开”一点。我会玩一玩,看看我能做些什么谢谢你对ui的看法。如果不是这样显示,用户将如何编辑它?我在想:在只读表的右边有一个按钮,上面写着“编辑”,如果单击它,那么编辑器只会为该行打开。你同意用户界面会更简单吗?(理论上)编辑是自动进行的。
Table#isCellEditable
TableCellEditor#isCellEditable
组合在一起工作,当它们都返回
true
时,单元格将变得可编辑…另一个考虑因素(行高)是平台之间的差异,您需要设计一些方法,以便在运行时计算这些行的合适高度。谢谢!一旦我发现您的示例的最后两行代码块被截断,我就能够让它工作了。修复缩进没有达到编辑的字符限制,所以我无法修复它。也许为了达到字符限制,您可以添加一些注释来指出您添加了哪些行?另外,是否有再次创建模型的原因?