【问题标题】:Change the border color of the inner popup (JList) of a JComboBox更改 JComboBox 的内部弹出窗口 (JList) 的边框颜色
【发布时间】:2016-07-04 12:39:15
【问题描述】:

我有一个 JComboBox,其中几乎所有的布局都发生了变化。我更改了弹出窗口中的选择颜色、箭头按钮、背景颜色等。最后剩下的部分,我看不到我想要的样子,是弹出窗口的边框颜色(内部 JList)。

我的组合框是这样的:

如您所见,它有一个黑色边框,与整个布局不匹配。我想将其更改为您在上方边框中看到的蓝色。

我做了一些研究,但没有任何解决方案适合我。最接近的解决方案是 post。但它没有用。

随着选择颜色的变化,我已经尝试通过以下方式更改边框颜色:

public static void setSelectionColorOfComboBox(JComboBox<String> comboBox)
{
    Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
    BasicComboPopup popup = (BasicComboPopup) child;
    JList list = popup.getList();
    list.setBorder(new LineBorder(ColorPalette.LIGHT_BLUE, 1));
    list.setSelectionBackground(ColorPalette.LIGHT_BLUE);
    list.setSelectionForeground(Color.WHITE);
    list.setFocusable(false);
}

根据上面的链接帖子,为了确保不会遗漏任何内容,我创建了一个单独的方法来更改该边框:

public static void setBorderColorOfComboBoxPopup(JComboBox<String> comboBox)
{
    Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
    BasicComboPopup popup = (BasicComboPopup) child;
    JList list = popup.getList();
    list.setBorder(new LineBorder(ColorPalette.LIGHT_BLUE));
}

但这也不起作用。有谁知道为什么这些常用方法对我不起作用,或者至少有人知道改变边框颜色的另一种方法,所以我可以尝试不同的方法?

目前我正在考虑,如果 JList 周围有类似滚动窗格的东西,如果可能的话,我会研究是否可以访问它并设置它的边框。

【问题讨论】:

    标签: java border jscrollpane jcombobox jlist


    【解决方案1】:

    你可以重写BasicComboBoxUI类中的createPopup()方法来改变弹出框的边框:

    jComboBox.setUI(new BasicComboBoxUI() {
        @Override
        protected ComboPopup createPopup() {
            BasicComboPopup basicComboPopup = new BasicComboPopup(comboBox);
            basicComboPopup.setBorder(new LineBorder(Color.RED));
            return basicComboPopup;
        }
    });
    

    【讨论】:

    • 好的,谢谢。几分钟前,我也想到了那个解决方案。 :) 我仍然会将其标记为最佳答案。
    【解决方案2】:

    经过数小时的尝试和研究,我对滚动窗格的最后一个想法引导我在短短几分钟内找到了解决方案。考虑到包含列表的组件,我想到了弹出窗口。弹出窗口包含两个级别,可以有一个边框。 第一个是弹出窗口中的 JList,第二个是弹出窗口本身。不知何故,黑色边框覆盖了我内部 JList 的蓝色边框。 长话短说,下面的代码片段完成了工作:

    public static void setBorderColorOfComboBoxPopup(JComboBox<String> comboBox)
    {
        Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
        BasicComboPopup popup = (BasicComboPopup) child;
        popup.setBorder(new LineBorder(ColorPalette.LIGHT_BLUE));
    //  JList list = popup.getList();
    //  list.setBorder(new LineBorder(ColorPalette.LIGHT_BLUE));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      相关资源
      最近更新 更多