JComboBox, содержащий Icon, слишком мал для Mac - PullRequest
5 голосов
/ 02 июля 2011

В настоящее время я разрабатываю приложение Swing, которое будет выполняться на любой платформе. Общее приложение не является проблемой, оно отлично работает на Windows, Linux и Mac.

Но у меня есть JComboBox, который отображает в дополнение к тексту также Icon (размер 50x50). Я понимаю, что у Mac строгие правила компоновки, а слишком большой размер JComboBoxes на самом деле не нужен. Проблема в том, что при использовании Mac Look-and-Feel мои JComboBoxes имеют правильную ширину, но высота слишком мала (такая же высота, как если бы не было иконки). Поэтому верхняя и нижняя часть моего Icon обрезаны, что не очень красиво выглядит.

Отображение JComboBox без Icon не имеет смысла, но я пока не нашел решения для отображения JComboBox с правильной высотой (даже с настройками MinimumSize, PreferredSize и MaximumSize на icon.getIconHeight()+2 не помогает). В Windows или Linux JComboBoxes отображаются правильно.

Могу ли я использовать какое-либо свойство или мне действительно нужно жить с обрезанными иконками?

1 Ответ

4 голосов
/ 02 июля 2011

Использование CustomComboBoxDemo показано в Как использовать поля со списком , пользовательский рендерер работает как положено; но делегат пользовательского интерфейса com.apple.laf.AquaComboBoxUI игнорирует запрос, подобный следующему:

petList.setPreferredSize(new Dimension(200, 130));

enter image description here

В качестве альтернативы javax.swing.plaf.metal.MetalComboBoxUI дает результат, показанный ниже. Обратите внимание, что стрелка и полоса прокрутки (не показаны) остаются без изменений. Кроме того, стрелка может быть изменена, как показано здесь .

Приложение: Вы можете изменить значения по умолчанию для пользовательского интерфейса ad lib , как показано ниже.

//Create the combo box.
JComboBox petList = new JComboBox(intArray);
Color bg = (Color) UIManager.get("ComboBox.background");
Color fg = (Color) UIManager.get("ComboBox.foreground");
UIManager.put("ComboBox.selectionBackground", bg);
UIManager.put("ComboBox.selectionForeground", fg);
petList.setUI(new MetalComboBoxUI());
ComboBoxRenderer renderer = new ComboBoxRenderer();

....

enter image description here

...