Проблемы с выравниванием Java Swing (BoxLayout)

Я очень новичок в Java Swing, и у меня довольно много проблем с созданием приятного макета. Я проверил Google и даже другие ответы на этом веб-сайте, но никакая информация, которую я не нашел, похоже, не решает проблему. Вот результат моих стараний:

введите здесь описание изображения

Как видите, метка, текстовое поле и кнопка не выровнены. Моя цель состоит в том, чтобы все они имели одинаковую левую границу, а кнопка и текстовое поле имели одинаковую правую границу, причем эти левые и правые границы находились на одинаковом расстоянии от левой и правой стороны. стороны моего окна.

Вот важные части моего кода:

    public void run()
    {
         JFrame frame = new JFrame("Arduino Server");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         InstancePanel = new ServerGUIPanel();
         frame.getContentPane().add(InstancePanel);
         frame.pack();
         frame.setVisible(true);
    }

И в ServerGIPanel.java:

    public ServerGUIPanel()
    {
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setPreferredSize(new Dimension(500, 500));
        setBorder(new EmptyBorder(10, 10, 10, 10));



        StatusLabel = new JLabel("STATUS: BOOTUP");
        add(StatusLabel);

        PortField = new JTextField();
        PortField.setPreferredSize(new Dimension(5000, 20));
        PortField.setMaximumSize(PortField.getPreferredSize());
        PortField.setActionCommand("PortChanged");
        add(PortField);

        ConnectionButton = new JButton();
        ConnectionButton.setPreferredSize(new Dimension(5000, 20));
        ConnectionButton.setMaximumSize(ConnectionButton.getPreferredSize());
        ConnectionButton.setActionCommand("ConnectionClicked");
        add(ConnectionButton);
    }

У кого-нибудь есть простое решение для этого? Что я здесь делаю неправильно?

Большое тебе спасибо!

--Джорджес Оутс Ларсен


person Georges Oates Larsen    schedule 16.04.2014    source источник
comment
@peeskillet Спасибо за предложение! Я не стал использовать GridLayout, но я использовал GridBagLayout, и это, похоже, (пока) работает.   -  person Georges Oates Larsen    schedule 16.04.2014


Ответы (2)


Прочтите раздел руководства по Swing Как использовать BoxLayout для основы использования BoxLayout, а также раздел, посвященный вопросам выравнивания.

В основном вам нужно убедиться, что значениеalignX всех компонентов установлено как выровненное по левому краю.

Также:

  1. Не используйте setPreferredSize() для установки размера компонента. Каждый компонент Swing определяет свой предпочтительный размер.
  2. Используйте соглашения об именах Java. Имена переменных НЕ должны начинаться с заглавной буквы.
person camickr    schedule 16.04.2014
comment
Я пробовал это; похоже, что по умолчанию они выровнены по левому краю. Все мои элементы, выровненные по левому краю, по-прежнему приводят к тому, что каждый элемент принципиально имеет разные отступы/поля. - person Georges Oates Larsen; 16.04.2014
comment
В ответ на № 1: Как вы рекомендуете заставить мою кнопку расширяться на всю ширину окна, если не использовать большой предпочтительный размер? - person Georges Oates Larsen; 16.04.2014
comment
I have tried this; - Ты сделал что-то не так. Опубликуйте свой SSCCE, демонстрирующий вашу проблему. How do you recommend forcing my button to expand to the full width of the window, - вам нужно будет использовать другой менеджер компоновки. GridLayout сделает все компоненты одинакового размера. Или вы можете использовать GridBagLayout и указать разные значения заполнения для каждого компонента. Еще раз прочитайте учебник, вы также найдете разделы по вышеперечисленным менеджерам компоновки с рабочими примерами. - person camickr; 16.04.2014
comment
@GeorgesOatesLarsen Если вы не хотите, чтобы JButton заполнил все доступное пространство в своей строке, маловероятно, что вы захотите использовать BoxLayout. Попробуйте GridBagLayout, как рекомендовано здесь: stackoverflow.com/a/12174503/2081889 - person Taylor Hx; 16.04.2014
comment
@Dæmon, camickr, понятно! В этом есть смысл. GridBagLayout вроде работает. Спасибо за ссылку, Демон. - person Georges Oates Larsen; 16.04.2014
comment
@camickr Я предполагаю, что на данном этапе SSCCE не понадобится, поскольку я перешел на использование GridBagLayout. Учитывая, что GridBagLayout требуется для типа выравнивания макета, который я хочу (выравнивание по левому краю по-прежнему не будет учитывать тот факт, что я также хочу, чтобы правые границы были выровнены, как указано в сообщении), я приму ваш ответ, если вы включите GridBagLayout как вариант. - person Georges Oates Larsen; 16.04.2014
comment
@GeorgesOatesLarsen Нет проблем. Хороший справочник по встроенным макетам Swing можно найти здесь, в следующий раз вы не знаете, какой LayoutManager использовать. - person Taylor Hx; 16.04.2014
comment
@GeorgesOatesLarsen, I will accept your answer if you include GridBagLayout as an option — я уже указал (и выделил) как вариант еще до того, как Демон даже вступил в разговор. - person camickr; 16.04.2014
comment
@Dæmon Я вижу! Вы можете рассмотреть возможность объединения ваших комментариев в ответ, поскольку я считаю, что предоставленная вами информация достойна быть отмеченной как верная! (Моя проблема все время заключалась в том, что я использовал неправильный менеджер компоновки) - person Georges Oates Larsen; 16.04.2014
comment
@camickr Никакое чтение учебника по BoxLayout не решит вышеуказанную проблему, использование BoxLayout не приведет к выравниванию левой и правой границ. В моем поиске Google я столкнулся с большинством ссылок, которые вы разместили. Теперь, если вы хотите, чтобы я принял ваш ответ, измените свой ответ так, чтобы он сосредоточился на том факте, что мне нужен совершенно другой менеджер компоновки, а не просто бросил ссылку на учебник, в котором обсуждается мой неправильно выбранный менеджер компоновки, даже не вдаваясь в какие-либо подробности относительно того, в чем заключается моя настоящая проблема, или почему тот менеджер принял неправильное решение. - person Georges Oates Larsen; 16.04.2014
comment
@GeorgesOatesLarsen, основываясь на быстром прочтении вашего вопроса и на картинке, я подумал, что вы задаетесь вопросом, почему компоненты не выровнены по левому краю, поэтому я просто предложил простой BoxLayout. Затем, основываясь на вашем втором комментарии о форсировании кнопки на полную ширину, я предложил два возможных менеджера компоновки, которые вы могли бы использовать, и даже предложил, какое ограничение вам нужно использовать для GridBagLayout. Я предположил, что вы можете пойти оттуда, или если вам нужна дополнительная помощь, вы можете обратиться к учебнику. - person camickr; 16.04.2014
comment
@camickr Я здесь не для того, чтобы превзойти ваш ответ и не подвергать сомнению ваши рассуждения. В конце концов, именно вы предложили использовать GridBagLayout в первую очередь. Но я бы не стал принимать ответ, основанный на предпосылке, что настоящий ответ скрыт в комментариях. (Такая вещь может сбить с толку будущих программистов с той же проблемой). Все, о чем я прошу, это изменить свой ответ (или, возможно, даже просто опубликовать второй), чтобы он сосредоточился на GridBagLayout, поскольку в конечном итоге это необходимое решение. - person Georges Oates Larsen; 16.04.2014

Я бы не рекомендовал использовать setPreferredSize() И setMaximumSize(). Последнее вызовет проблемы при растяжении основной рамы. [Ваши компоненты, скорее всего, не захотят изменять размер]

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

Кроме того, вы можете захотеть также придать своему основному фрейму макет. Можете ли вы опубликовать, как вы использовали свой GridBagLayout?

person user121449    schedule 16.04.2014