По какой-то причине Window LAF переопределяет макет кнопки по умолчанию. Это приводит к тому, что кнопка становится уже. Однако ширина редактора не увеличивается, чтобы учесть более узкую кнопку, поэтому появляется зазор. Вот код из WindowsComboBoxUI:
protected LayoutManager createLayoutManager() {
return new BasicComboBoxUI.ComboBoxLayoutManager() {
public void layoutContainer(Container parent) {
super.layoutContainer(parent);
if (XPStyle.getXP() != null && arrowButton != null) {
Dimension d = parent.getSize();
Insets insets = getInsets();
int buttonWidth = arrowButton.getPreferredSize().width;
arrowButton.setBounds(WindowsGraphicsUtils.isLeftToRight((JComboBox)parent)
? (d.width - insets.right - buttonWidth)
: insets.left,
insets.top,
buttonWidth, d.height - insets.top - insets.bottom);
}
}
};
}
Лучшим макетом может быть что-то вроде:
comboBox.setUI( new WindowsComboBoxUI()
{
@Override
protected LayoutManager createLayoutManager()
{
return new BasicComboBoxUI.ComboBoxLayoutManager()
{
public void layoutContainer(Container parent)
{
super.layoutContainer(parent);
System.out.println(editor.getBounds());
System.out.println(arrowButton.getBounds());
// if (XPStyle.getXP() != null && arrowButton != null)
// {
Dimension d = parent.getSize();
Insets insets = getInsets();
int buttonWidth = arrowButton.getPreferredSize().width;
boolean isLeftToRight = parent.getComponentOrientation().isLeftToRight();
arrowButton.setBounds(isLeftToRight
? (d.width - insets.right - buttonWidth)
: insets.left, insets.top, buttonWidth, d.height - insets.top - insets.bottom);
System.out.println(editor.getBounds());
System.out.println(arrowButton.getBounds());
Dimension size = editor.getSize();
editor.setSize(arrowButton.getLocation().x - 1, size.height);
// }
}
};
}
});
Я добавил вывод, чтобы показать, как изменяется ширина редактора до / после настройки XP. Также я не знаю, как проверить XP LAF, поскольку класс XPStyle не является общедоступным.
Импорт для LAF:
import javax.swing.plaf.basic.*;
import com.sun.java.swing.plaf.windows.*;