Java 如何在不扩展JFrame的情况下设置窗口大小?

Java 如何在不扩展JFrame的情况下设置窗口大小?,java,swing,user-interface,Java,Swing,User Interface,我刚开始用java学习gui。我现在可以在扩展JFrame时创建具有特定大小的窗口。然而,我在这里读到的帖子说,最好不要扩展JFrame。然后我尝试通过在JPanel中设置大小来创建一个窗口,但是setSize似乎不起作用(我的代码肯定缺少一些东西) 这是我的框架代码 import javax.swing.JFrame; public class MyFrame{ private JFrame mainFrame; private MyPanel mainPanel; public

我刚开始用java学习gui。我现在可以在扩展JFrame时创建具有特定大小的窗口。然而,我在这里读到的帖子说,最好不要扩展JFrame。然后我尝试通过在JPanel中设置大小来创建一个窗口,但是setSize似乎不起作用(我的代码肯定缺少一些东西)

这是我的框架代码

import javax.swing.JFrame;
public class MyFrame{
  private JFrame mainFrame;
  private MyPanel mainPanel;

  public MyFrame(){
      mainFrame = new JFrame();
      mainPanel = new MyPanel(50, 50);

      mainFrame.add(mainPanel);
      mainFrame.setVisible(true);
  }
}
这是我的面板代码

import javax.swing.JPanel;
public class MyPanel extends JPanel{
    public MyPanel(int i, int j){
         setSize(i, j);
    }
}
我尝试在frame类中添加frame.pack(),因为我认为没有设置大小的frame太小,无法看到面板-我错了

我的代码中缺少什么

我的代码中缺少什么

启动器自定义组件(
面板
)的首选尺寸
@Override getPreferredSize()
返回逻辑值

然后
pack()
安装框架,以确保它是显示面板和任何其他组件所需的最小尺寸

比如说:

import javax.swing.*;

public class Application {

    private JFrame frame;
    private CustomPanel panel;

    public Application() {
        frame = new JFrame();
        // next 2 lines, just a good idea
        frame.setLocationByPlatform(true);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // at 50x50, the title bar on Windows is wider!
        panel = new CustomPanel(200, 200);
        frame.add(panel);
        // make the frame smallest it can be and still show components
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                new Application();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

class CustomPanel extends JPanel {

    public CustomPanel(int w, int h) {
        setPreferredSize(new java.awt.Dimension(w, h));
    }
}

注:鉴于AWT包同时包含两个(相同名称)组件,因此
Frame
Panel
都是自定义组件的混淆名称。请为类使用更多的原始名称,甚至/特别是在供其他人查看的短代码段中。我通常使用
WhatTheAppDoesFrame
&
的策略来描述此组件组如何描述Panel
。感谢您这么快就获得了它!:)另请参见我的(大部分是多余的)编辑。;)