1

以前の経験から、誰もが「これらの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
        }
    }
}

これは、私が実際にすばやくまとめたコードの例です。ゲームエリアを600x600にする必要がある場合は、どうすればよいですか?ここで使っても大丈夫setPreferredSizeですか?単一のコンポーネントを取得してサイズを指定できるレイアウトマネージャーはありません。レイアウトマネージャー全体を使用する代わりに、これを使用する方がはるかに簡単ではありませんか。

ちなみに、f.setSize(600, 600)フレームの装飾(タイトルバー、境界線など)が考慮されているため、ここでは機能しません。

したがって、問題は、特定のサイズである必要があるコンポーネントが1つしかない場合、どうすればよいかということです。

4

2 に答える 2

4

オーバーライドgetPreferredSize、でGamePanel

public Dimension getPreferredSize(){
    return new Dimension(600, 600);
}
于 2012-12-11T02:01:46.190 に答える
1

なぜこれだけでなく、これを行うのsetPreferredSize()ですか?

そのままGameですJPanel_

  • 描画のみに使用され、

  • デフォルトのレイアウトが含まれていますが、コンポーネントは含まれていません

  • 標準のUIデリゲートがあり、

違いはごくわずかです。オーバーライドする理由はまだありますgetPreferredSize()

  • その意図は他の開発者には明らかです。ゾンビのようなデモやプロトタイプがなくなることはありません。

  • これらの条件のいずれかまたはすべては、クラスが進化するにつれて変化する可能性があります。

  • この罠に陥らないようにするのは慣用的なリマインダーです。

于 2012-12-11T02:33:54.567 に答える