使用自定义面板时可以使用setPreferredSize吗?

时间:2012-12-11 01:57:14

标签: java

根据以往的经验,每个人都会说“不要使用那些setXxxSize方法!请使用布局管理器!”但是,在这种情况下我该怎么办?

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

public class Game {
    public static void main(String[] args) {
        new Game();
    }
    public Game() {
        JFrame f = new JFrame("Hi this is a game");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new GamePanel());
        f.pack(); 
        f.setVisible(true);
    }
    private class GamePanel extends JPanel {
        private GamePanel() {
            setPreferredSize(600, 600);
        }
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D)g;
            //paint stuff
        }
    }
}

这只是我快速拼凑的一些示例代码。当我需要制作600到600的游戏区域时,我该怎么办?可以在这里使用setPreferredSize吗?我不知道任何布局管理器可以只占用一个组件并给它一个大小,即使有,也不是更容易使用它而不必使用整个布局管理器? / p>

顺便说一句,f.setSize(600, 600)在这里不起作用,因为它考虑了框架装饰(标题栏,边框事物)。

所以问题是如果我只有一个需要特定尺寸的组件,我该怎么办?

2 个答案:

答案 0 :(得分:4)

getPreferredSize中覆盖GamePanel

public Dimension getPreferredSize(){
    return new Dimension(600, 600);
}

答案 1 :(得分:1)

  

为什么this而不只是setPreferredSize()

由于GameJPanel

  • 仅用于绘图,

  • 包含默认布局但没有组件和

  • 有一个标准的UI委托,

差异可以忽略不计。仍有理由覆盖getPreferredSize()

  • 其他开发人员的目的很明确;像僵尸一样的演示和原型永远不会消失。

  • 随着课程的发展,任何一个或所有这些条件都可能会发生变化。

  • 这是一个惯用的提醒,不要落入this trap