Как я могу улучшить рендеринг JLabels? - PullRequest
2 голосов
/ 08 июля 2011

Я пытаюсь создать быстрый и грязный интерфейс свинга. В моем пользовательском интерфейсе есть пара JTextFields, затем JTextArea в JScrollPane, так как содержимое JTextArea может стать большим.

Я использую простой BoxLayout, я не хотел тратить часы на GridBagLayout.

Моя проблема в том, что когда я изменяю размер окна, JLabels становятся огромными. У них будет одна строка текста, сидящая в огромном количестве пустого пространства. Это выглядит некрасиво и расточительно. JTextArea, с другой стороны, никогда не увеличится в размере, потому что JScrollPane заботится о дополнительном контенте. Таким образом, у меня будут огромные JTextFields и крошечная JTextArea в области прокрутки с едва видимой линией.

Есть ли простой способ убедиться, что JTextFields никогда не увеличивают свою высоту за пределы одной строки текста? Может быть, переопределение getMaximumSize / getPreferredSize? Если да, то каким будет код?

Единственная функция, которая разрешит эту ситуацию, - это JFrame.pack (), но она изменит размер окна (крайне нежелательно) и иногда не утруждает себя ограничением рабочего стола.

Ответы [ 2 ]

2 голосов
/ 08 июля 2011
label.setMaximumSize( label.getPreferredSize() );

Или, что еще лучше, переопределите метод getMaximumSize (), чтобы вернуть предпочтительный размер.

На самом деле, я принимаю это предложение обратно, поскольку максимальный размер этикетки является предпочтительным. Однако это метод, который будет работать с другими компонентами, такими как JTextField, например, при использовании BoxLayout.

Опубликуйте SSCCE , который демонстрирует проблему.

Edit:

На самом деле я думаю, что проблема в том, что попытки BoxLayout увеличат высоту всех компонентов, когда есть дополнительное пространство. Для решения этой проблемы необходимо использовать:

panel.add( Box.createVerticalGlue() );

как последний компонент для предотвращения выделения дополнительного пространства для компонентов.

0 голосов
/ 08 июля 2011

createVerticalGlue () ничего не делает O_O. Возможно я сделал это неправильно.

Превосходный максимальный размер работает чудесно. Почему Java не делает это по умолчанию ???

public class TextFTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        JFrame jf = new JFrame();

        class X extends JTextField {

            public X(String text) {
                super(text);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(super.getMaximumSize().width,
                                    getPreferredSize().height);
            }

        }

        jf.getContentPane().setLayout(
                new BoxLayout(jf.getContentPane(), BoxLayout.Y_AXIS));

        X f = new X("Hello");
        jf.getContentPane().add(f);

        JTextField f1 = new JTextField("Hello1");
        jf.getContentPane().add(f1);

        jf.getContentPane().add(Box.createVerticalGlue());

        jf.validate();

        jf.setSize(300, 300);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
    }

}

Прошу прощения за мои ужасные стандарты кодирования.

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