2012-02-25 16 views
3

以下の例では、JPanelですべてのJFrameを使用する方法を教えてください。私は好ましいサイズを800x420に設定しましたが、実際には792x391しか塗りません。JFrame内のJPanelをウィンドウ全体に埋め込む方法は?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics2D; 
import java.awt.image.BufferStrategy; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class BSTest extends JFrame { 
    BufferStrategy bs; 
    DrawPanel panel = new DrawPanel(); 

    public BSTest() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); // edited line 
     setVisible(true); 
     setSize(800,420); 
     setLocationRelativeTo(null); 
     setIgnoreRepaint(true); 
     createBufferStrategy(2); 
     bs = getBufferStrategy(); 
     panel.setIgnoreRepaint(true); 
     panel.setPreferredSize(new Dimension(800,420)); 
     add(panel, BorderLayout.CENTER);  // edited line 
     panel.drawStuff(); 
    } 

    public class DrawPanel extends JPanel { 
     public void drawStuff() { 
      while(true) { 
       try { 
        Graphics2D g = (Graphics2D)bs.getDrawGraphics(); 
        g.setColor(Color.BLACK); 
        System.out.println("W:"+getSize().width+", H:"+getSize().height); 
        g.fillRect(0,0,getSize().width,getSize().height); 
        bs.show(); 
        g.dispose(); 
        Thread.sleep(20); 
       } catch (Exception e) { System.exit(0); } 
      } 
     } 
    } 

    public static void main(String[] args) { 
     BSTest bst = new BSTest(); 
    } 
} 
+1

スイングエンジンには独自のペイントループがありますが、while(真)は必要ありません。あなたのパネルクラスの 'JComponent.paint(Graphics g)'をオーバーライドするだけです。 –

+0

こんにちは@Joe、 'paint()'を使わない 'BufferStrategy'をここで使用しようとしています。 'setIgnoreRepaint(true);'が何のためのものであるかを示します。万一私が窓全体をどのように満たすことができるかについての考え? –

+0

はい、JPanelを 'JFrame.setContentPane()'に渡してみてください。 –

答えて

6

あなたは、フレームと他には何にのみ1つのパネルを持っている場合、この試してみてください。

  • フレームでのBorderLayoutセット。
  • BorderLayout.CENTER

とフレームにパネルを追加することは、これが理由のJPanelでwhileループで何が起こっているかもしれませ。(なぜ?実際の理由を見つけるわからない。それを見つけたときに更新します。)あなたの場合paintComponent(g)方法でそれを置き換えるすべてが正常に動作します:

public BSTest() { 
    //--- your code as it is 
    add(panel, BorderLayout.CENTER); 
    //-- removed panel.drawStuff(); 
} 

public class DrawPanel extends JPanel { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(Color.BLACK); 
     System.out.println("W:" + getSize().width + ", H:" + getSize().height); 
     g2d.fillRect(0, 0, getSize().width, getSize().height); 
    } 
} 

//your code as it is. 
+0

こんにちは@ハリー、私はちょうどあなたの提案を試みました(上記のコードでは新しい*編集された行を見てください)。 –

+0

@fleawhale:私の編集を参照してください。 –

+0

ありがとうございますが、ここでは 'paintStartgy'を使って' paintComponent'を使用しないゲームを作ろうとしています。まずあなたが作ったものを描画し、次に 'bs.show()'を使ってバッファを反転します。 –

3

はここで代わりにパックを使用する代替です。

import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class PackExample extends JFrame { 

    public PackExample(){ 
     JPanel panel = new JPanel(); 
     panel.setPreferredSize(new Dimension(800,600)); 
     panel.setBackground(Color.green); 
     add(panel); 
     pack(); 
     setVisible(true); 
    } 

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

} 
+0

'pack()'に+1; -1 'setPreferredSize()' [間違って]を使用しています(http://stackoverflow.com/q/7229226/230513)。 – trashgod

+0

@trashgod DYM 1)高度なレイアウト(別名「kleopatraメソッド」)を使用する2) 'getPreferredSize()'をオーバーライドする3)何か他に何か? 1)は第三者のレイアウトが必要なため、コアJ2SE(これは問題でも問題ではないかもしれません)では実行できません。2)コンポーネントの望ましいサイズを柔軟にします。 jtpと同じようにサイズを設定することをお勧めします。 +1 –

+1

@AndrewThompson:ありがとうございます。私は、2)[getPreferredSize() '](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#getPreferredSize%28%29)のような意味で[ここで](http://stackoverflow.com/a/9447425/230513)と箇条書き1 [ここ](http://stackoverflow.com/a/7229662/230513)に記載されています。私は説明できない 'setPreferredSize()'が、この文脈で誤解を招く可能性があると考えています。それはパネルの中身によって異なります:より多くのコンポーネント→ 'setPreferredSize()'悪い;ペイント→ 'setPreferredSize()' OK。 – trashgod

1

あなたは真すなわちframe.setUndecorated(true);にsetUndecoratedに必要なのJPanelの全体でのJFrameを記入してください。しかし、今、あなたは

0

これは把握が、これまでその実際に最も簡単なコードするために永遠に連れて行ってくれた右上(Windowsオペレーティングシステム)に向けて、あなたのMAXIMIZE <最小にし、CLOSEボタンを心配する必要があります。 親パネルを作成してGridLayoutを渡し、このように子パネルを追加するだけです。

JPanel parentPanel= new JPanel(new GridLyout()); 
JPanel childPanel= new JPanel(); 
parentPanel.add(childPanel); 
関連する問題