Борьба за решетку - PullRequest
       17

Борьба за решетку

0 голосов
/ 27 февраля 2019

Я пытаюсь создать следующий графический интерфейс в Java Swing.Проведя некоторые исследования, я обнаружил, что Grid Bag Layout был самым гибким и «лучшим» менеджером для использования.Проблема в том, что у меня есть некоторые проблемы с этим, и я не могу понять это.

Это макет, который я хочу создать:

enter image description here

Это действительно просто, но это то, что я хочу.Я хочу начать с простого.

Я начал с заголовка и только с первых кнопок, но вот что произошло:

enter image description here

Название в порядке, но кнопки растянуты до упора.Конечно, это из-за: gc.fill = GridBagConstraints.HORIZONTAL, но этого хочется, но не до конца.возможно 1/6 кадра.

В любом случае, это мой код:

public class MainFrame extends JFrame {

    private XJLabel jlNaam, welcome;
    private XJTextField jtfNaam;
    private XJButton jbOk;
    private XJButton jbOk2;

    public MainFrame() {
        setTitle("TITLE");
        setSize(600, 400);
        setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        welcome = new XJLabel("TITLE!", 30);
        welcome.setHorizontalAlignment(SwingConstants.CENTER);

        jbOk = new XJButton("ok");
        jbOk2 = new XJButton("ok2");

        GridBagConstraints gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.insets = new Insets(10, 10, 10, 10);
        gc.anchor = GridBagConstraints.FIRST_LINE_START;

        gc.gridy = 0;
        gc.gridx = 0;
        gc.weighty = 1;
        gc.weightx = 3;
        panel.add(welcome, gc);

        gc.gridy = 1;
        gc.gridx = 0;
        gc.weighty = 1;
        gc.weightx = 1;
        panel.add(jbOk, gc);

        gc.gridy = 2;
        gc.gridx = 0;
        gc.weighty = 1;
        gc.weightx = 1;
        panel.add(jbOk2, gc);

        add(panel);

        setVisible(true);
    }

}

Классы "X" не являются чем-то особенным, просто они делают его немного лучше.

В любом случае, есть кто-нибудь, кто может мне помочь с этим?Я не хочу, чтобы выписывался полный графический интерфейс, но указатель в правильном направлении был бы великолепен!И если могут быть лучшие способы сделать это, пожалуйста, скажите мне.Обратите внимание: я в школе, поэтому не разрешено использовать сторонних менеджеров по верстке.Так что я должен повесить на стандартные ...

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

GridBagLayout - один из самых гибких менеджеров компоновки, но он также является одним из самых сложных.

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

Example

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test extends JFrame {

    public static void main(String[] args) {
        new Test();
    }

    public Test() throws HeadlessException {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("");
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.fill = GridBagConstraints.HORIZONTAL;

            // Fill the first row
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            JLabel title = new JLabel("Title!");
            title.setHorizontalAlignment(JLabel.CENTER);
            add(title, gbc);

            // First column, second row
            gbc.anchor = GridBagConstraints.NORTHWEST;
            gbc.fill = GridBagConstraints.NONE;
            gbc.weightx = 0;
            gbc.insets = new Insets(10, 10, 10, 10);
            gbc.gridwidth = 1;
            gbc.gridy++;

            add(makeLabel("Button"), gbc);

            // First column, second row
            gbc.gridy++;
            add(makeLabel("Button 2"), gbc);

            // Second column, second row
            gbc.gridx++;
            add(makeLabel("Button 3"), gbc);

            // Last column
            gbc.gridx++;
            // The the remaining area
            gbc.weightx = 1;
            gbc.weighty = 1;
            // Bottom/right
            gbc.anchor = GridBagConstraints.SOUTHEAST;
            add(makeLabel("Button 4"), gbc);
        }

        protected JLabel makeLabel(String text) {
            JLabel label = new JLabel(text);
            label.setOpaque(true);
            label.setForeground(Color.WHITE);
            label.setBackground(Color.BLUE);
            return label;
        }
    }
}

Очевидно, это прямое использование GridBagLayout.В зависимости от ваших потребностей, вам может быть проще использовать две или более компоновки компоновки вместо

0 голосов
/ 27 февраля 2019

В вашем случае все выглядит так, как будто вы хотите компоненты в 3 столбцах.

Проблема в том, что в вашем случае у вас нет ни одной строки, содержащей 3 столбца компонентов, поэтому вы не можете расположить «Заголовок» и нижнюю «Кнопку» так, как вам бы хотелось.

Так что, если вы хотите использовать GridBagLayout, вам нужно его подделать.Так что во второй строке вам нужно будет добавить фиктивный компонент в 3-х столбцах.Вы должны иметь возможность использовать Box.createHorizontalStrut(10) и добавить его в строку в 3-м столбце.

Теперь в первом ряду компонент можно отцентрировать, задав ему gridwidth = 3

InВ последней строке вы добавляете кнопку, используя gridx = 2.

. Прочтите раздел из учебника Swing по Как использовать GridBagLayout .Демонстрация там делает почти точно то, что вы хотите.

Я обнаружил, что Grid Bag Layout был самым гибким и «лучшим» менеджером для использования

Однако выникогда не заставляет использовать один менеджер компоновки.

Например, вы можете использовать панель с вертикальной BoxLayout.Тогда вы бы:

  1. добавили ярлык на панель.
  2. добавьте кнопку на панель.
  3. создайте панель sccond, используя выравнивание по левому краю FlowLayout и добавьте кнопки на панель кнопок и панель.
  4. add Box.createVerticalGlue() на панель.
  5. добавьте последнюю кнопку на панель.

Примечание:

  1. Вам нужно будет использовать setAlignmentX(...) метод для правильного выравнивания компонентов в левом / центральном / правом положениях.

  2. Для панелей кнопок вам нужно будет использовать buttonsPanel.setMaximumSize( buttons.getPreferredSize() ), чтобы предотвратить рост панели по высоте.

Попробуйте внедрить оба решения, чтобы лучше понять концепцию менеджеров раскладки.Затем вы можете выбрать вариант, который вы предпочитаете для будущих макетов.

...