Я использую Metal L & F. Я хочу сделать JComboBox, который имеет только 1 пиксельную границу. Это не проблема, если cb равен editable. Это соответствует первому cb в изображении под названием «Редактируемый».Не редактируемые JComboBox Border
cb.setEditable(true);
((JTextComponent) (cb.getEditor().getEditorComponent())).setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, COLOR));
Но когда я cb.setEditable (ложь), дополнительная граница происходит внутри коробки (изменен на красный в картине «раскрывающийся», вы видите оригинальный цвет в картине под названием «Fixed»). Хотя я попытался установить границу, и я также попытался использовать свой собственный CellRenderer, граница по-прежнему окрашивается. Мне кажется, что нежелательная граница не исходит от CellRenderer. Когда я пытаюсь манипулировать границей из самого cb (см. Комментарий //), он только добавляет/удаляет дополнительную внешнюю границу. Редактор Компонент также, похоже, не несет ответственности за меня.
cb.setRenderer(new CbCellRenderer());
//cb.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, COLOR));
//cb.setBorder(BorderFactory.createEmptyBorder());
class CbCellRenderer implements ListCellRenderer {
protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
renderer.setBorder(BorderFactory.createEmptyBorder());
return renderer;
}
}
Я также опробовал некоторые переменные пользовательского интерфейса, подобные приведенным ниже, не влияя на эту границу.
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
UIManager.put("ComboBox.selectionForeground", Color.green);
UIManager.put("ComboBox.disabledBackground", Color.green);
...
Изображение: http://upload.mtmayr.com/dropdown_frame.png(ссылка сломана)
Полный код для тестирования:
import java.awt.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.plaf.basic.BasicComboPopup;
public class ComboTest {
private Vector<String> listSomeString = new Vector<String>();
private JComboBox editableComboBox = new JComboBox(listSomeString);
private JComboBox nonEditableComboBox = new JComboBox(listSomeString);
private JFrame frame;
public final static Color COLOR_BORDER = new Color(122, 138, 153);
public ComboTest() {
listSomeString.add("row 1");
listSomeString.add("row 2");
listSomeString.add("row 3");
listSomeString.add("row 4");
editableComboBox.setEditable(true);
editableComboBox.setBackground(Color.white);
Object child = editableComboBox.getAccessibleContext().getAccessibleChild(0);
BasicComboPopup popup = (BasicComboPopup) child;
JList list = popup.getList();
list.setBackground(Color.white);
list.setSelectionBackground(Color.red);
JTextField tf = ((JTextField) editableComboBox.getEditor().getEditorComponent());
tf.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, COLOR_BORDER));
nonEditableComboBox.setEditable(false);
nonEditableComboBox.setBorder(BorderFactory.createEmptyBorder());
nonEditableComboBox.setBackground(Color.white);
Object childNonEditable = nonEditableComboBox.getAccessibleContext().getAccessibleChild(0);
BasicComboPopup popupNonEditable = (BasicComboPopup) childNonEditable;
JList listNonEditable = popupNonEditable.getList();
listNonEditable.setBackground(Color.white);
listNonEditable.setSelectionBackground(Color.red);
frame = new JFrame();
frame.setLayout(new GridLayout(0, 1, 10, 10));
frame.add(editableComboBox);
frame.add(nonEditableComboBox);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(100, 100);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ComboTest ct = new ComboTest();
}
});
}
}
аналогичные проводки: [link1] (http://stackoverflow.com/questions/10569759/ border-editor-when-rendering-item-in-jcombobox-and-editable-false) [link2] (http://stackoverflow.com/questions/10169022/jcombobox-does-not-behave-same-as-jtextfield -how-can-i-have-it-look-like) [link3] (http://stackoverflow.com/questions/9322903/how-do-you-change-border-of-the-pop-up-section-of-a-jcombobox) [link4] (http: //stackoverflow.com/questions/776893/remove-border-from-jcombobox) – mtmayr