Пиксели Java Swing являются неточными - PullRequest
0 голосов
/ 08 декабря 2018

Я занимаюсь разработкой приложения на Java с помощью Swing, и у меня возникают проблемы при разработке графического интерфейса без макета.

Моя цель - создать графический интерфейс с одним JPanel и четырьмя JButton с.Я сделал математику, чтобы установить кнопки и панель в нужном месте и закодировал их следующим образом:

import java.awt.*;
import javax.swing.*;

public class MainFrame extends JFrame {
    public MainFrame() {
        this.setTitle("Example Frame");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(null);

        JPanel randomPanel = new JPanel();
        randomPanel.setOpaque(true);
        randomPanel.setBackground(Color.RED);
        randomPanel.setBounds(10, 10, 430, 530);

        JButton addButton = new JButton("Add");
        addButton.setBounds(10, 550, 100, 40);
        addButton.setBackground(Color.GRAY);

        JButton deleteButton = new JButton("Delete");
        deleteButton.setBounds(120, 550, 100, 40);
        deleteButton.setBackground(Color.GRAY);

        JButton refreshButton = new JButton("Refresh");
        refreshButton.setBounds(230, 550, 100, 40);
        refreshButton.setBackground(Color.GRAY);

        JButton devButton = new JButton("Developer");
        devButton.setBounds(340, 550, 100, 40);
        devButton.setBackground(Color.GRAY);

        this.add(randomPanel);
        this.add(addButton);
        this.add(deleteButton);
        this.add(refreshButton);
        this.add(devButton);

        this.setSize(900, 600);
        this.setResizable(false);
        this.setVisible(true);
    }

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

В соответствии с кодом компоненты должны быть расположены следующим образом:

Expected Form

Однако фактическая форма отображалась следующим образом:

Actual Form

Компоненты превышают форму, которая не соответствует ожидаемому виду.

В чем проблема этого и что нужно сделать для точного размещения компонентов?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Есть две основные проблемы ...

  • setLayout(null)
  • setSize

То, что вы не учли, этотот факт, что объем пространства, доступного для содержимого окна, равен размеру окна МИНУС украшений кадра.

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

Вы могли бы взглянуть на:

для получения более подробной информации.

Лучшее решение - использовать один или несколько доступных менеджеров компоновки.В приведенном ниже примере просто используются BorderLayout и GridLayout с помощью EmptyBorder для обеспечения некоторого заполнения

См. Компоновка компонентов в контейнере для получения более подробной информации

Simple

Преимущества

  • Адаптируемый макет:
    • В примере используется pack для«упаковать» окно вокруг содержимого автоматически, без необходимости адаптировать свой код к работающей в данный момент ОС (или оформлению фрейма, обеспечиваемому другим внешним видом и интерфейсом)
    • Пользователь может изменить размер окна иразмер контента изменится автоматически - бонус для пользователя.
    • Макет будет адаптирован к системным настройкам пользователя, поэтому, если они используют шрифт большего размера, чем вы рассчитывали, он не будет полностью взорванваше лицо
    • Хотите добавить больше кнопок?Не беспокойтесь, выбейте себя из строя, просто добавьте больше кнопок, раскладка будет адаптироваться автоматически, не нужно «нажимать на пиксели» когда-либо компонент на экране

Пример запуска ...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            setBorder(new EmptyBorder(10, 10, 10, 10));
            add(new SizablePane(430, 530));

            JPanel buttonPane = new JPanel(new GridLayout(1, 3, 20, 0));
            buttonPane.setBorder(new EmptyBorder(10, 0, 0, 0));
            buttonPane.add(new JButton("Add"));
            buttonPane.add(new JButton("Delete"));
            buttonPane.add(new JButton("Refresh"));
            buttonPane.add(new JButton("Developer"));

            add(buttonPane, BorderLayout.SOUTH);
        }

    }

    public class SizablePane extends JPanel {

        private Dimension size;

        public SizablePane(int width, int height) {
            size = new Dimension(width, height);
            setBackground(Color.RED);
        }

        @Override
        public Dimension getPreferredSize() {
            return size;
        }

    }

}

Нужно добавить больше кнопок?Легко ...

JPanel buttonPane = new JPanel(new GridLayout(1, 0, 20, 0));
buttonPane.setBorder(new EmptyBorder(10, 0, 0, 0));
buttonPane.add(new JButton("Add"));
buttonPane.add(new JButton("Delete"));
buttonPane.add(new JButton("Refresh"));
buttonPane.add(new JButton("Developer"));
buttonPane.add(new JButton("Some"));
buttonPane.add(new JButton("More"));
buttonPane.add(new JButton("Buttons"));
0 голосов
/ 08 декабря 2018

Вам необходимо переопределить метод getInsets () базового JFrame.

@Override
public Insets getInsets() {
    return new Insets(0, 0, 0, 0);
}

Посмотрите на этот вопрос для получения дополнительной информации.

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