Java Swing отходит от нулевого макета

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

Для всех, кто интересуется, я первоначально использовал ноутбук Dell Inspiron с Windows 10 и перешел на ноутбук Asus (я не знаю реальную модель, но сенсорный экран может отсоединиться от клавиатуры), также с Windows 10,

Мой вопрос:

Какой менеджер компоновки будет самым быстрым и простым для создания графического интерфейса, показанного на рисунке выше (нет в наличии Swing Layouts и другие). Я хотел бы, чтобы этот макет учитывал фактические размеры компонентов только для нескольких, но не для всех компонентов. Используя этот макет, как мне расположить кнопку инвентаря (молоток внизу слева), чтобы нижний левый угол кнопки инвентаря находился на 5 пикселей вверх и вправо от нижнего левого угла контейнера, даже после изменения размера контейнер?

Заранее спасибо. Вся помощь приветствуется.

РЕДАКТИРОВАТЬ: параметры "иди и найди ключ" и "попытаться открыть дверь" должны учитывать их размеры.

1 ответ

Решение

Самое простое решение, которое приходит мне в голову, это BorderLayout для основной панели. Добавить textarea в NORTH / PAGE_START, Сделать другой BorderLayout содержащий кнопку инвентаря (WEST / LINE_START) и метка местоположения (EAST / LINE_END). Добавьте это к SOUTH / PAGE_END из основных BorderLayout, Затем просто добавьте BoxLayout с вертикальным выравниванием к основному BorderLayout "s CENTER содержащий две кнопки. Вот учебник для стандартных менеджеров по расположению.


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Insets;
import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Example {

    public Example() {
        JTextArea textArea = new JTextArea("There is a locked door");
        textArea.setRows(5);
        textArea.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        textArea.setEditable(false);

        WhiteButton button1 = new WhiteButton("Go find a key") {
            @Override
            public Dimension getMinimumSize() {
                return new Dimension(200, 25);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 25);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(200, 25);
            }
        };
        WhiteButton button2 = new WhiteButton("Attempt to force the door open");
        button2.setMargin(new Insets(0, 60, 0, 60));

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
        buttonPanel.add(button1);
        buttonPanel.add(Box.createVerticalStrut(5));
        buttonPanel.add(button2);

        WhiteButton inventoryButton = new WhiteButton(
                new ImageIcon(new BufferedImage(50, 50, BufferedImage.TYPE_INT_RGB)));

        JLabel locationLabel = new JLabel("Location: 0");
        locationLabel.setVerticalAlignment(JLabel.BOTTOM);

        JPanel southPanel = new JPanel(new BorderLayout());
        southPanel.add(inventoryButton, BorderLayout.WEST);
        southPanel.add(locationLabel, BorderLayout.EAST);

        JPanel mainPanel = new JPanel(new BorderLayout(0, 5));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        mainPanel.add(textArea, BorderLayout.NORTH);
        mainPanel.add(buttonPanel);
        mainPanel.add(southPanel, BorderLayout.SOUTH);

        JFrame frame = new JFrame("Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }

    private class WhiteButton extends JButton {

        public WhiteButton() {
            setBackground(Color.WHITE);
        }

        public WhiteButton(String text) {
            this();
            setText(text);
        }

        public WhiteButton(ImageIcon icon) {
            this();
            setIcon(icon);
            setBorder(BorderFactory.createLineBorder(Color.GRAY));
        }

    }

}
Другие вопросы по тегам