2011-11-19 5 views
25

私のコードは動作しません:Java Swingで特定のウィンドウ(フレーム)サイズを設定する方法は?

JFrame frame = new JFrame("mull"); 

mull panel = new mull(); 

// add panel to the center of window 
frame.getContentPane().add("Center", panel); 
frame.setSize(500, 300); // << not working!!! 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.pack(); // give a suitable size to window automatically 
frame.setVisible(true); // make window visible 

私は非常に小さなウィンドウを取得しています。それを修正するには?

+1

*「Java swingで特定のウィンドウ(フレーム)サイズを設定する方法」*フレームのコンテンツペインまたはコンテンツペインのコンポーネントの優先サイズを設定することがより一般的です。フレーム自体の大きさを知っていると仮定すると、コンテンツの配置やレンダリングの方法からは、問題が発生します。 –

答えて

47

まあ、frame.setSize()frame.pack()の両方を使用しています。

一度に1つずつ使用してください。

setSize()を使用すると、フレームのサイズを指定できますが、pack()を使用すると、フレーム内のコンポーネントのサイズに応じて自動的にフレームのサイズが変更されます。以前に言及したサイズは考慮されません。

コードからframe.pack()を削除するか、サイズを設定して実行するようにしてください。

+2

ありがとう!出来た! –

+1

ようこそ! :) – gprathour

+4

'setSize()'の前に 'pack()'を移動しますが**削除しないでください! GUIからの正しいレイアウトのためには、 'pack()'(フレーム)や 'validate()'(アプレット)の呼び出しが必要です。レイアウトマネージャは、パックされたときに*どれくらい大きなサイズにする必要があるかを決めることができます(サイズ、優先サイズ、最大サイズ、または場合によっては最小サイズを設定する呼び出しを取り除きます)。 -1 –

8

ほとんどのレイアウトマネージャは、コンポーネントのpreferredSizeで最もうまく動作します。ほとんどのGUIは、含まれているコンポーネントがその内容やプロパティに基づいて独自のpreferredSizesを設定できるようにするのが最適です。これらのレイアウトマネージャを最大限に活用するには、JFramesなどのトップレベルコンテナでpack()に電話をかけてから、表示するようにしてください。

コンポーネントのサイズを設定する際に直接的な役割を果たす必要がある場合は、getPreferredSizeをオーバーライドし、super.preferredSizeより大きいDimensionを返すようにします(そうでない場合はスーパーの値を返します)。私のメインクラスはJPanelの者のgetPreferredSize JPanelのある、と私はオーバーライドすること

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

public class MoveRect extends JPanel { 
    private static final int RECT_W = 90; 
    private static final int RECT_H = 70; 
    private static final int PREF_W = 600; 
    private static final int PREF_H = 300; 
    private static final Color DRAW_RECT_COLOR = Color.black; 
    private static final Color DRAG_RECT_COLOR = new Color(180, 200, 255); 
    private Rectangle rect = new Rectangle(25, 25, RECT_W, RECT_H); 
    private boolean dragging = false; 
    private int deltaX = 0; 
    private int deltaY = 0; 

    public MoveRect() { 
     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     addMouseListener(myMouseAdapter); 
     addMouseMotionListener(myMouseAdapter); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (rect != null) { 
     Color c = dragging ? DRAG_RECT_COLOR : DRAW_RECT_COLOR; 
     g.setColor(c); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.draw(rect); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyMouseAdapter extends MouseAdapter { 

     @Override 
     public void mousePressed(MouseEvent e) { 
     Point mousePoint = e.getPoint(); 
     if (rect.contains(mousePoint)) { 
      dragging = true; 
      deltaX = rect.x - mousePoint.x; 
      deltaY = rect.y - mousePoint.y; 
     } 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
     dragging = false; 
     repaint(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
     Point p2 = e.getPoint(); 
     if (dragging) { 
      int x = p2.x + deltaX; 
      int y = p2.y + deltaY; 
      rect = new Rectangle(x, y, RECT_W, RECT_H); 
      MoveRect.this.repaint(); 
     } 
     } 
    } 

    private static void createAndShowGui() { 
     MoveRect mainPanel = new MoveRect(); 

     JFrame frame = new JFrame("MoveRect"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

注:たとえば

は、ここで私はanother question on this siteのために作成小さなドラッグ矩形アプリです

public class MoveRect extends JPanel { 
    //.... deleted constants 

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

    //.... deleted fields and constants 

    //... deleted methods and constructors 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

私は自分のGUIを表示するときにJFrameに入れ、JFrameのpack();を呼び出し、その位置を設定してから、私のJFrameにsetVisible(true);を呼び出します:

private static void createAndShowGui() { 
     MoveRect mainPanel = new MoveRect(); 

     JFrame frame = new JFrame("MoveRect"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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