【问题标题】:2 column jcombobox2列jcombobox
【发布时间】:2012-05-28 12:35:06
【问题描述】:

我对多列 jcombobox 有很多用途,但还没有找到,也没有设法制作我自己的。我尝试了几种在网络上找到的方法,但都没有奏效。之后我在某处读到那些(旧)在当前 Java 版本下不起作用。

到目前为止,我已经成功地制作了自己的组合框,组合框有一个表格作为下拉列表,我可以用鼠标选择一个项目,但目标是当用户开始在编辑框中键入时,下拉列表打开并根据用户编写的文本移动光标。似乎来自例如的事件JTextField editor = (JTextField) comboBox.getEditor().getEditorComponent() 不起作用。

有没有人设法制作一个两列组合框或有任何想法,当用户开始输入时我如何获得事件。

【问题讨论】:

    标签: java swing jcombobox


    【解决方案1】:

    您正在寻找自动完成功能(据我所知):SwingX 支持它 - 并且非常易于使用。

    归结为实现自定义 ObjectToStringConverter 并使用该转换器配置带有 autoCompleteDecorator 的组合框。比如:

    /**
     *  A converter which expects an item of an array type and returns
     *  a string representation of its first value. 
     */
    public static class ArrayToStringConverter extends ObjectToStringConverter {
    
        @Override
        public String getPreferredStringForItem(Object item) {
            if (!(item instanceof Object[])) return DEFAULT_IMPLEMENTATION.getPreferredStringForItem(item);
            Object[] array = (Object[]) item;
            return DEFAULT_IMPLEMENTATION.getPreferredStringForItem(array[0]);
        }
    
    }
    
    // usage
    // assuming an model with items being arrays 
    JComboBox combo = new JComboBox(arrayModel);
    // the renderer supporting multiple columns, f.i. a table
    combo.setCellRenderer(new TabularListRenderer());
    AutoCompleteDecorator.decorate(combo, new ArrayToStringConverter());
    

    一个完整的工作示例(包括渲染器并展示如何强制弹出窗口的宽度大于组合本身)是TableAsListRenderer in my incubator section

    顺便说一句:自动完成功能是一个独立模块,可通过 maven 访问或从 maven rep at java.net 手动下载,您可能需要 swingx-autocomplete-1.6.4.jar(加上相应的文档/来源,如果有兴趣)

    【讨论】:

    • 有趣的代码描述,从我的立场来看只有 +1,我肯定会重新发明轮子,我(仍然)会用 JTable 替换 JList 并覆盖 ListSelectionListener 或 MouseClicked
    【解决方案2】:

    有没有人设法制作一个两列组合框或有任何想法,当用户开始输入时我如何获得事件。

    您可以将JTable 放入JComboBox,但默认情况下,您只能从整个JTables 行中选择值,而不是直接从JTables Cell 中选择值(需要额外的解决方法,尚未尝试)

    【讨论】:

      【解决方案3】:

      我也在寻找这个答案

      这是我到目前为止尝试的.. 我创建 Jpopup 并将 Jtable 放在那里.. 然后我使用 jlabel 而不是 jcombobox, 当用户单击 jlabel 时,弹出窗口(Jtable)将显示在该 jlabel 位置。 当用户在 jtable 上选择值时, 然后弹出窗口将处理, 然后 jlabel 将显示结果..

      对于您的情况,您可以使用 jtextfield 而不是 jlabel

      编辑: 继承人相关问题 enter link description here

      【讨论】:

      • 在 Swing 中不能同时管理两个弹窗(基于 Popup),然后 JComboBox 的弹窗消失,被隐藏,抱歉没办法,没有简单的解决方法,仍然注册为 Bug 没有正确修复(来自 Java4)
      • 我不使用组合框.. 但 10000% 我仍然同意.. 它会包含许多错误.. 并且没有简单的解决方法.. 谢谢纠正
      猜你喜欢
      • 1970-01-01
      • 2012-03-09
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 2017-09-02
      • 2011-07-10
      相关资源
      最近更新 更多