2016-07-04 15 views
1

У меня есть JComboBox, где почти все было изменено относительно макета. Я изменил цвет выделения во всплывающем окне, кнопке со стрелкой, цвета фона и т. Д. Последняя оставшаяся часть, которую я не получаю, чтобы посмотреть, как я ее хочу, - это цвет рамки всплывающего окна (внутренний JList).Изменить цвет рамки внутреннего всплывающего окна (JList) JComboBox

Мой выпадающий выглядит следующим образом:

enter image description here

Как вы можете видеть, он имеет черную кайму, которая не соответствия на весь макет. Я хочу изменить это на синий цвет, который вы видите на границе выше.

Я провел некоторое исследование, но никакое решение не работало для меня. Ближайшим решением было post. Но это не сработало.

Наряду с изменением цвета seleciton, я уже пытался изменить цвет границы следующим образом:

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, и я сделаю некоторое исследование о том, могу ли я получить доступ к нему и установить его границу, если это возможно.

ответ

1

Вы можете переопределить метод createPopup() в BasicComboBoxUI классе, чтобы изменить границу для всплывающего окна:

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

Да, спасибо. Пару минут назад я тоже пришел к этому решению. :) Я по-прежнему буду отмечать это как лучший ответ. – KJaeg

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)); 
}