2016-07-25 17 views
0

次のクラスはウィンドウ/フレームを作成します。Java jframeキャンバスとjpanelを追加する

public class Window { 

private int width, height; 
private JFrame frame; 
private Canvas canvas; 
private String title; 
private JButton button; 
private JPanel panel; 

public Window(String title){ 

    System.out.println("Initialization Window..."); 

    this.title = title; 

    width = Reference.width; 
    height = Reference.height; 

    button = new JButton("cool button"); 

    CreateWindow(); 
} 

private void CreateWindow(){ 

    frame = new JFrame(title); 
    frame.setSize(width, height); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 

    panel = new JPanel(); 
    panel.add(button); 

    canvas = new Canvas(); 
    canvas.setPreferredSize(new Dimension(width, height)); 
    canvas.setMaximumSize(new Dimension(width, height)); 
    canvas.setMinimumSize(new Dimension(width, height)); 
    canvas.setFocusable(false); 

    frame.add(canvas); 
    frame.add(panel);//my problem is in this line 
    frame.pack(); 
} 

フレームキャンバスにjpanelを追加しました。フレームのサイズは、私が作ったボタンの非常に小さいサイズに設定されています。 "frame.add(panel)を削除すると通常のサイズに戻ります。私は何か見落としてますか?

jpanelとcanvasを使用している場合はなぜですか?よく私はキャンバスを使用しているので、私は描画グラフィックのためにbufferstategyを使用し、ボタンやその他のものを追加するにはjpanelが必要です。

+0

試してみてください。ここで コードです。 – Darren

答えて

3
  1. あなたは両方がBorderLayout.CENTERのpostionにデフォルトで追加されており、第二の成分はので、ここで最初にカバーし、そして、そのようなJFrameののようにBorderLayoutを、使用するすべてのコンテナにデフォルトのやり方で二つの成分を追加JPanelはCanvasをカバーし、Canvasは表示されないので、その優先サイズは無視されます。
  2. JPanel、Canvas、JFrameに配置されているコンポーネントの相対的な位置を正確に把握し、レイアウトとの戦いではなくレイアウトマネージャを使用するあなたのコードが現在行っているように。
  3. 何でも、ペストのようなnullのレイアウトは避けてください。
  4. 通常、AWTコンポーネントとSwingコンポーネントを混在させることは悪い考えです。 あなたはキャンバスを使用する必要がありますか? JPanelはデフォルトでダブルバッファリングされています。これは、アニメーションが目標であれば、アニメーションを平滑化します。
+0

はい私の目標は、より良いアニメーションを作成し、スイングでボタンやその他のものを使用することです。 – HeRoXLeGenD1

+0

キャンバスを作成してパネルでオーバーレイする方法を教えてください。アニメーションをクリックしてボタンをクリックすることができます。 – HeRoXLeGenD1

0

何か他のものを拡張しない限り、ちょうどJFrameを拡張した方が簡単だったと思います。 コードの可読性と再利用性のためには、従来のJavaのルールとベストプラクティスに従う必要があることを理解する必要があります。

@Hovercraft Eelsの完全版はあなたが上記で必要としているすべてを説明しました。私がここで行うのは、彼が言ったことを複製する必要がないように、あなたを模範にしておくことです。 FlowLayoutはJavaで最も簡単で簡単なレイアウトマネージャですが、GridLayoutまたはGrdiBagLayoutと比べて非常に強力ではありません。フレームに直接パネルにキャンバスを追加し、代わりの

public class Window extends JFrame { 

    private int width, height; 
    private Canvas canvas; 
    private String title; 
    private JButton button; 
    private JPanel panel; 

    public Window(String title){ 
     super(title); 
     System.out.println("Initialization Window..."); 

     this.title = title; 
     setLayout(new FlowLayout()); 

     //width = Reference.width; 
     //height = Reference.height; 

     button = new JButton("cool button"); 

     createWindow(); 
    } 

    private void createWindow(){ 


     setSize(width, height); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setVisible(true); 

     panel = new JPanel(); 
     panel.add(button); 

     canvas = new Canvas(); 
     canvas.setPreferredSize(new Dimension(200, 200)); 
     canvas.setMaximumSize(new Dimension(400, 400)); 
     canvas.setMinimumSize(new Dimension(200, 200)); 
     canvas.setFocusable(false); 

     add(canvas); 
     add(panel);//my problem is in this line 
     pack(); 
    } 

} 
+1

JFrameを拡張しないほうがそのメソッドのうちの1つをオーバーライドするなど、JFrameの本来の動作を変更することを計画している場合を除きます。通常は、JPanelを拡張するか、クラスにJPanelを生成させる方がよいでしょう。これにより、コードの柔軟性が大幅に向上します。 –

+0

@HovercraftFullOfEelsあなたは「...これによりコードの柔軟性が大幅に向上します」と言っています。 JFrameの拡張が大好きな理由だと思います。私がJFrameを拡張すると、複数のJPanelを追加して、個別にまたはリストを使用して好きな振る舞いを与えることができます。もう1つは、ほとんどの場合、プログラムで複数のJFramesを使用するため、別々のウィンドウとして表示するほうがずっと簡単です。しかし、私はあなたの意見を試していないので、私はそうし、私が得るものを見ます。ありがとうございました。 – funaquarius24

+0

GUIクラスがJPanelの作成に向いている場合は、JFrameやJDialog、JTabbedPanesに配置したり、CardLayoutsでスワップしたり、複雑なGUIのモジュラーコンポーネントとして他のJPanelに配置することができます。必要なときはいつでも。 –

関連する問題