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

3
我刚开始学习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(),因为我认为未设置大小的框架太小,无法看到面板 - 我错了。
我的代码缺少什么?
1个回答

4

我的代码有什么缺陷?

首先为自定义组件(Panel)设置首选大小。使用 @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));
    }
}

1
请注意,FramePanel都是自定义组件的混淆名称,因为AWT包具有相同名称的组件。 请为类使用更原始的名称,即使/特别是在供他人查看的短代码片段中也是如此。 我通常使用WhatTheAppDoesFrameHowThisComponentGroupCanBeDescribedPanel的策略。 - Andrew Thompson
1
你的速度真快,干得好! :) 另外请看我的(大部分是多余的)编辑。 ;) - Andrew Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接