Как я могу создать JComboBox, который имеет границу нулевой ширины? - PullRequest
0 голосов
/ 30 мая 2018

Я хочу отобразить «таблицу», где JLabel выровнено по правому краю в столбце 1, а компонент выровнен по левому краю в столбце 2 для каждой строки.Я смог сделать так, чтобы компоненты столбца 2 были JLabel, JTextField и JCheckBox.Но по понятным причинам у меня проблемы с JComboBox.

. Я вижу два пути (возможно, три), чтобы решить проблему.

  1. увеличить левую вставку для компонентов, не являющихся JComboBox
  2. обнулить вставки для всех компонентов и позволить менеджеру раскладки обрабатывать пробелы
  3. играть с 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:

enter image description here

По подсказке Сергея я протестировал код в Windows 10 и Fedora 20 и также не смог воспроизвести проблему.Это заставляет меня удивляться .Также по его подсказке я попытался установить пользовательский интерфейс на BasicComboBoxUI вместо использования по умолчанию com.apple.laf.AquaComboBoxUI, и проблема с выравниванием не проявилась.К сожалению, этот интерфейс непривлекателен по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...