Я хочу отобразить «таблицу», где JLabel
выровнено по правому краю в столбце 1, а компонент выровнен по левому краю в столбце 2 для каждой строки.Я смог сделать так, чтобы компоненты столбца 2 были JLabel
, JTextField
и JCheckBox
.Но по понятным причинам у меня проблемы с JComboBox
.
. Я вижу два пути (возможно, три), чтобы решить проблему.
- увеличить левую вставку для компонентов, не являющихся JComboBox
- обнулить вставки для всех компонентов и позволить менеджеру раскладки обрабатывать пробелы
- играть с UIManager для обнуления вставок JComboBox?
Опция # 2 выглядела какболее простой подход, чтобы понять, реализовать и поддерживать, пока я не попробовал.Я начал с FormLayout
, но, поскольку у меня возникли те же проблемы "смещения", что и с GridLayout
, я решил опубликовать версию GridLayout, чтобы упростить проверку.Пожалуйста, скажите мне, что я могу получить вариант № 2, работающий без особых проблем, или как заставить работать вариант № 3.
Ниже приведен мой MCV пример:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.basic.*;
public class TestFrame3 extends JFrame {
public TestFrame3 () {
JLabel l1 = new JLabel("l1"); l1.setBorder(new EmptyBorder(0, 0, 0, 0));
JLabel r1 = new JLabel("r1"); r1.setBorder(new EmptyBorder(0, 0, 0, 0));
JLabel l2 = new JLabel("l2"); l2.setBorder(new EmptyBorder(0, 0, 0, 0));
JComboBox r2 = new JComboBox(); r2.setBorder(new EmptyBorder(0, 0, 0, 0));
r2.setRenderer(new BasicComboBoxRenderer() {
@Override
public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JComponent comp = (JComponent) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
comp.setBorder(new EmptyBorder(0, 0, 0, 0));
return comp;
}
});
JPanel p = new JPanel();
p.setLayout(new GridLayout(2, 2));
p.add(l1);
p.add(r1);
p.add(l2);
p.add(r2);
getContentPane().add(p);
setSize(new Dimension(100, 200));
}
public static void main (String args[]) {
new TestFrame3().setVisible(true);
}
}
Вот что отображается, показывая, что 'r' в 'r1' не выровнено с крайними левыми пикселями обводки границы JComboBox
:
По подсказке Сергея я протестировал код в Windows 10 и Fedora 20 и также не смог воспроизвести проблему.Это заставляет меня удивляться .Также по его подсказке я попытался установить пользовательский интерфейс на BasicComboBoxUI
вместо использования по умолчанию com.apple.laf.AquaComboBoxUI
, и проблема с выравниванием не проявилась.К сожалению, этот интерфейс непривлекателен по-другому.