更改JComboBox的内部弹出窗口(JList)的边框颜色

时间:2016-07-04 12:39:16

标签: java border jscrollpane jcombobox jlist

我有一个JComboBox,几乎所有关于布局的内容都有所改变。我更改了弹出窗口中的选择颜色,箭头按钮,背景颜色等。最后剩下的部分,我没有看到我想要的方式,是弹出窗口的边框颜色(内部JList)。 / p>

我的组合框看起来像这样:

enter image description here

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

我做了一些研究,但没有解决方案适合我。最接近的解决方案是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周围的滚动窗格,我会做一些关于我是否可以访问它并设置其边框的研究,如果可能的话。

2 个答案:

答案 0 :(得分:1)

您可以覆盖createPopup()类中的BasicComboBoxUI方法来更改弹出窗口的边框:

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

答案 1 :(得分:0)

经过几个小时的尝试和研究,我对滚动窗格的最后一个想法引导我在几分钟内找到解决方案。考虑到包含列表的组件,我想到了弹出窗口。弹出窗口包含两个级别,可以有边框。 第一个是弹出窗口中的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));
}