Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-设置装饰JFrame的大小_Java_Swing_Jframe_Size_Window Decoration - Fatal编程技术网

Java-设置装饰JFrame的大小

Java-设置装饰JFrame的大小,java,swing,jframe,size,window-decoration,Java,Swing,Jframe,Size,Window Decoration,我对JFrame的大小有问题: 我想在Jframe中显示内容。内容大小为640 x 480。但是我不能使用方法JFrame.setSize(640480)

我对JFrame的大小有问题:

我想在Jframe中显示内容。内容大小为640 x 480。但是我不能使用方法
JFrame.setSize(640480)
我认为我的问题的解决方案可能类似于:

这是我的密码:

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);

    }


}
this.setLayout(null)是您的问题。让布局管理器完成它的工作

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
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题


有关更多详细信息,请参见…

this.setLayout(null)是您的问题。让布局管理器来做它的工作。前面你强调的问题不是完全相同的问题,或者至少接受的解决方案是不正确的……”我的第一个想法是:添加一个具有首选维度的面板,然后使用pack();。“你的第一个想法是正确的(在最佳实践中是正确的,可以让它发挥作用)。我会坚持找出失败的原因。