【问题标题】:Java remove JComboBox arrow buttonJava删除JComboBox箭头按钮
【发布时间】:2017-04-28 14:32:58
【问题描述】:

我使用 netbeans IDE 从调色板中添加了一个 JComboBox,并使用 mysql 数据库中的内容填充它。我还使用 swingx-all-1.6.5-1 添加了自动完成功能

组合框的填充方法

    public void doPopulateCombo(){
    Connection con = Functions.ConnectToDB();
    try {
        Statement stmt = con.createStatement();
        String sqlQuery = "select * from products";
        ResultSet rs = stmt.executeQuery(sqlQuery);

        while(rs.next()){
            String product_name = rs.getString("Product_Name");
            cboProducts.addItem(product_name);
        }
        con.close();
        cboProducts.setSelectedIndex(-1);
    } catch (Exception e) {
        JOptionPane.showMessageDialog(this, "Error populating combo box\n"+e.toString(),
                "Error",JOptionPane.ERROR_MESSAGE);
    }
}

如何删除组合框的箭头按钮,使其看起来像一个文本框?

【问题讨论】:

  • Hide JComBox Box Arrow的可能重复
  • 并非如此,删除箭头按钮但更改自动完成行为。它不会选择列表中的自动建议项目。关于如何做到这一点的任何建议?
  • 以上链接中接受的答案有一个使用JTextFieldAutoCompleteDecorator的替代解决方案。

标签: java swing jcombobox


【解决方案1】:

我能想到的最好的方法是将它放入比它略小的 JPanel 中,但取决于 L&F,这并不是最好的方法。或者,您可以创建一个扩展 JComboBox 的类,覆盖paint(Graphics g) 方法,并从那里调用具有相同尺寸的文本框的paint 方法。至少,如果你愿意,我认为你可以做到这一点。请注意,每次用户选择一个选项时,您都必须更新文本框中的内容。

【讨论】:

    【解决方案2】:

    解决此问题的一种巧妙方法是创建您自己的 BasicComboBoxUI 实现并覆盖 createArrowButton()

    public class NoArrowJComboBoxUI extends BasicComboBoxUI {
    
        @Override
        protected JButton createArrowButton() {
            JButton btn = new JButton();
            btn.setPreferredSize(new Dimension(0,0));
            btn.setVisible(false);
            return btn;
        }
    
    }
    

    然后在您现有的代码中:

        cboProducts.setSelectedIndex(-1);
        cboProducts.setUI(new NoArrowJComboBoxUI());
    

    这个实现不应该干扰自动完成行为,但是,我自己没有用自动完成测试过,所以我不能肯定地说。

    【讨论】:

    • 它确实有点干扰,因为自动建议的项目不会在列表中自动选择,只是在组合框上自动完成