2017-06-26 14 views
1

私はゲームPONGをプログラムしようとします。JPanelの周りにJFrameをスケールする方法は?

問題:サイズ(1000; 600)の「マッチフィールド」としてJPanelを使用します。しかし、JFrameにsetSize(matchfieldの次元)を使ってJPanelを追加すると、右と下の境界に問題があります。 JFrameがサイズ(1000; 600)を取得し、JPanelが小さくなったようです。 どうすれば修正できますか?

+1

使用 'JFrameの番号のpack'、これはあなたがコンポーネントが適切なサイジングのヒントを提供しているしていると仮定し、内容を中心にウィンドウをパックします – MadProgrammer

答えて

2

JPanelのサイズは、サイズではなく、推奨サイズで決める必要があります。これを行う最も簡単な方法は、setPreferredSize(...)を呼び出すことですが、それによって他のコードが優先サイズを変更できるため、最も安全な方法はpublic Dimension getPreferredSize()メソッドをオーバーライドすることです。 JPanelがJFrameのBorderLayoutにcontentPaneを使用して追加され、JPanelを追加して表示する前にJFrameでpack()を呼び出すと、JFrameは自動的に正しくサイズ変更されます。例えば

public class MyJPanel extends JPanel { 

    private static final int PREF_W = 1000; 
    private static final int PREF_H = 600; 

    public MyJPanel() { 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     // to make smooth graphics 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     // do your drawing here 
    } 

    // size the JPanel correctly 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("My GUI"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new MyJPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
関連する問題