Java - Установить размер украшенного JFrame

У меня проблема с размером JFrame:

Я хочу показывать контент в Jframe. Контент будет иметь размер 640 х 480. Но я не могу использовать метод JFrame.setSize(640, 480); потому что я тоже хочу показать оформление окна. Моей первой мыслью было: добавить панель с предпочтительным размером, а затем использовать pack();. Но это также не работает - у меня только очень маленькое окно.

Я думаю, что решение моей проблемы может быть похоже на это:

Вот мой код:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Fenster extends JFrame {

    JPanel panel;
    Dimension dim;

    Fenster(){

        dim = new Dimension(640, 480);

        panel = new JPanel();
        panel.setSize(dim);
        panel.setMinimumSize(dim);
        panel.setMaximumSize(dim);
        panel.setPreferredSize(dim);
        panel.setBounds(0, 0, 640, 480);
        panel.setDoubleBuffered(true);

        JLabel label = new JLabel("bla");
        panel.add(label);

        this.setLayout(null);
        this.getContentPane().add(panel);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        this.pack();
        this.setVisible(true);

    }


}

1 ответ

Решение

this.setLayout(null); это твоя проблема. Пусть менеджер верстки сделает свое дело

Из JavaDocs

public void pack ()

Заставляет размер этого окна соответствовать предпочтительному размеру и расположению его подкомпонентов. Результирующая ширина и высота окна автоматически увеличиваются, если любое из измерений меньше минимального размера, указанного в предыдущем вызове метода setMinimumSize.

Если окно и / или его владелец еще не отображаются, оба они становятся отображаемыми до вычисления предпочтительного размера. Окно проверяется после расчета его размера.

Большинство контейнеров (JComponent, JPanel) по умолчанию, предпочтительный размер 0x0менеджер компоновки предоставляет эту информацию на основе требований самого диспетчера компоновки и содержимого контейнера, но с использованием null, вы эффективно делаете контейнер 0x0...

Нет больше нулевых макетов

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

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.setUndecorated(true);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            add(new JLabel("Look ma, no null layouts!"));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(640, 480);
        }

    }

}

Избегать использования null макеты, идеальные пиксельные макеты - иллюзия в современном дизайне пользовательского интерфейса. Есть слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отказ от которых не приведет к концу проблем и проблем, которые вы будете тратить все больше и больше времени, пытаясь исправить

См. Почему не рекомендуется использовать пустой макет в SWING? Больше подробностей...

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