2011-06-19 5 views
4

私はスイングとAWT(リスナー用)を使って小さなプログラムを作っています。 JPanel(Chessというクラス)のサイズを取得することに問題があります。 マイレイアウト:Java、BorderLayout.CENTER、JPanelの幅と高さを取得

public class Main extends JFrame implements MouseListener, ActionListener{ 

    Chess chessPanel = new Chess(); 
    JButton newGameButton = new JButton ("New Game"); 
    JButton loadGameButton = new JButton ("Load Game"); 
    JButton saveGameButton = new JButton ("Save Game"); 
    JButton exitButton = new JButton ("Exit"); 

    public static void main (String [] args) { 
     new Main(); 
    } 

    Main() { 
     super ("Chess"); 
     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
     setSize(dim); 
     setLocation(0,0); 
     setUndecorated(true); 

     chessPanel.addMouseListener(this); 
     add(chessPanel, BorderLayout.CENTER); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new FlowLayout()); 


     newGameButton.addActionListener(this); 
     loadGameButton.addActionListener(this); 
     saveGameButton.addActionListener(this); 
     exitButton.addActionListener(this); 

     buttonPanel.add(newGameButton); 
     buttonPanel.add(loadGameButton); 
     buttonPanel.add(saveGameButton); 
     buttonPanel.add(exitButton); 

     add(buttonPanel, BorderLayout.SOUTH); 

     setVisible(true); 
    } 

    // ... Code ... 
} 

あなたがコードで見ることができるように、私は、ほぼすべての画面を取るCENTERの1のJPanelを、持っています。一番下には別のJPanel(SOUTH)があります。これにはボタンの行があります。

私が必要とするのは、CENTERのJPanelのサイズです。 JPanelから継承したgetWidth()、getHeight()またはgetBounds()メソッドを呼び出すと、BorderLayoutが原因ですべてが0を返します。 実際の値を取得する方法はありますか?

PS:画面は常に画面全体を占有しますが、それでも画面サイズが変更されることはありません。

答えて

7

JPanelがレンダリングされる前にgetWidthを呼び出している可能性がありますので、0になります。の後に、レンダリング後に解決することです。たとえば、pack()またはsetVisible(true)このJPanelを保持しているルートコンテナに格納されます。

また、標準のレイアウトマネージャの大部分がサイズではなくコンポーネントの優先サイズを観察し、レイアウトマネージャにそのことを知らせるpack()を呼び出すときに、setSize()設定されたサイズは通常無視されます。特定のサイズにする必要がある場合は、setPreferredSizeメソッドをオーバーライドすることによって、中央にあるJPanelを独自のサイズに設定することができます。パックを呼び出すと、レイアウトマネージャに基づいて、JFrameとその保持されているコンテナにベットフィットサイズが設定されます。

例えば、

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

public class Main extends JFrame { 

    Chess chessPanel = new Chess(); 
    JButton newGameButton = new JButton("New Game"); 
    JButton loadGameButton = new JButton("Load Game"); 
    JButton saveGameButton = new JButton("Save Game"); 
    JButton exitButton = new JButton("Exit"); 

    public static void main(String[] args) { 
     new Main(); 
    } 

    Main() { 
     super("Chess"); 
     add(chessPanel, BorderLayout.CENTER); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new FlowLayout()); 

     buttonPanel.add(newGameButton); 
     buttonPanel.add(loadGameButton); 
     buttonPanel.add(saveGameButton); 
     buttonPanel.add(exitButton); 

     System.out.printf("chessPanel Size before rendering: %s%n", chessPanel.getSize()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(buttonPanel, BorderLayout.SOUTH); 
     pack(); 
     System.out.printf("chessPanel Size after rendering: %s%n", chessPanel.getSize()); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    // ... Code ... 
} 

@SuppressWarnings("serial") 
class Chess extends JPanel { 
    private static final int CHESS_WIDTH = 600; 
    private static final int CHESS_HEIGHT = CHESS_WIDTH; 
    private static final int MAX_ROW = 8; 
    private static final int MAX_COL = 8; 
    private static final Color LIGHT_COLOR = new Color(240, 190, 40); 
    private static final Color DARK_COLOR = new Color(180, 50, 0); 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(CHESS_WIDTH, CHESS_HEIGHT); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int panelWidth = getWidth(); 
     int panelHeight = getHeight(); 
     int sqrWidth = panelWidth/MAX_ROW; 
     int sqrHeight = panelHeight/MAX_COL; 
     for (int row = 0; row < MAX_ROW; row++) { 
     for (int col = 0; col < MAX_COL; col++) { 
      Color c = (row % 2 == col % 2) ? LIGHT_COLOR : DARK_COLOR; 
      g.setColor(c); 
      int x = (row * panelWidth)/MAX_ROW; 
      int y = (col * panelHeight)/MAX_COL; 
      g.fillRect(x, y, sqrWidth, sqrHeight); 
     } 
     } 
    } 
} 
+0

@Hidde:どういたしまして! –

関連する問題