2016-07-24 15 views
1

現在、Head First Javaの第12章を読んでいます。彼らは、JFramesが中央、北、南、東、西に分割されていることをちょうど言及しました。次に、2つの引数add()メソッドを使用して、指定されたコンポーネントをそのJFrameで指定された領域に追加します。CENTER以外の領域へのJPanelの追加

5つの領域のそれぞれにJButtonを追加できます。 JButtonを中心に、自分のJPanelを中央領域に追加することもできます。しかし、JPanelを中心以外の領域に追加しようとすると、JPanelは表示されません。

JFrameの中央以外の領域にJPanelsを追加することについては何も触れていません。だから私の質問です:JFrameの北、南、東または西の領域にJPanelsを追加することは可能ですか?

私にこれを手伝うことができる人には、事前に感謝します。ここで

は、私は北の地域で私のJPanelを使用して実行しようとしてきたコードです:

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.BorderLayout; 

public class StackQ { 

    JFrame frame; 

    public static void main(String [] args) { 

     StackQ gui = new StackQ(); 
     gui.go(); 

    } 

    public void go() { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton button = new JButton("location test"); 
     JButton button2 = new JButton("location test"); 
     JButton button3 = new JButton("location test"); 
     JButton button4 = new JButton("location test"); 

     myDrawPanel custom = new myDrawPanel(); 

     frame.getContentPane().add(button, BorderLayout.CENTER); 
     frame.getContentPane().add(button2, BorderLayout.EAST); 
     frame.getContentPane().add(button3, BorderLayout.WEST); 
     frame.getContentPane().add(button4, BorderLayout.SOUTH); 

     frame.getContentPane().add(custom, BorderLayout.NORTH); 

     frame.setSize(300,300); 
     frame.setVisible(true); 
    } 

} 

class myDrawPanel extends JPanel { 

    public void paintComponent(Graphics g) { 

     int red = (int) (Math.random() * 255); 
     int green = (int) (Math.random() * 255); 
     int blue = (int) (Math.random() * 255); 

     Color random = new Color(red, green, blue); 
     g.setColor(random); 
     g.fillOval(20,20,100,100); 

    } 
} 
+0

このチュートリアルhttps://docs.oracle.com/javase/tutorial/uiswing/ を試してください。具体的には、https://docs.oracle.com/javase/tutorial/uiswing/components/toplevelを参照してください。htmlの – Aubin

答えて

2

それが明確になる可能性がありますが、これはBorderLayoutマニュアルに記載されています

コンポーネントは、適切なサイズとコンテナのサイズの制約に従って配置されます。CENTERコンポーネントは、残りのスペースを埋めるために水平方向と垂直方向の両方に伸びます。

別の言い方をすれば、(必要な場合)CENTERコンポーネントは、アプリケーションを埋めるために延伸され、任意の他の成分はCENTERからその一部を取るためにpreferred-sizeを指定する必要があります。

JButtonは、ボタンの内容に基づいてデフォルトで推奨サイズを指定します。一方、JPanelはそうではありません。その好ましいサイズはその内容に依存し、JPanelには内容がないため、好ましいサイズはゼロです。

要するに、JPanelに適したサイズを指定してください。BorderLayoutは、少なくともパネルに十分なスペースを割り当てようとします。

+0

は "割り当てようとします":解決のために多く – gpasch

+0

@gpaschよくはい; 'JFrame'がすべてのコンポーネントの好みのサイズに対応するのに十分な大きさ/高さでない場合は、何かが得られます。それが*好ましい*サイズの理由です。 'BorderLayout'コンポーネント自体がすべてのコンポーネントに適合するのに十分な大きさであれば、望ましいサイズが尊重されます。 – dimo414

+0

@ dimo414、お返事ありがとうございました。最初にJPanelでsetSize()メソッドを使用しようとしましたが、それでもフレームには表示されませんでした。それから、問題のJPanelでsetPreferredSize()メソッドを試してみました。フレームの北部に現れました! setSize()メソッドがうまくいかなかった理由は何ですか?また、「あなたのJPanelにはコンテンツがありません」と言うと、色で塗りつぶす楕円形はJPanelのコンテンツとしてカウントされませんか?再度、感謝します! – Wes1324

0

この投稿の今後の潜在的な視聴者にとっては、希望の結果を得るために、私は最初にStackQクラスの最上部にDimensionクラスをインポートしました(setPreferredSize()メソッドは、 ()メソッドは)タイプ寸法の引数を受け付けます。

import java.awt.Dimension; 

そして私はすぐにmyDrawPanelクラスのインスタンス化の後に行く()メソッドにこのコードを追加:

Dimension dims = new Dimension(1366, 200); 
custom.setPreferredSize(dims); 

私のように1366を選択しましたそれは私の画面がどれほど大きいかであるからです。

ありがとうございました。

+0

幅をゼロのままにしてください。それは「好ましい」サイズなので、レイアウトマネージャは必要な値だけを使用します。 "CENTER"コンポーネントが必要以上に広い場合は、 "NORTH"と "SOUTH"コンポーネントが水平に伸びているかもしれません。 'NORTH'と' SOUTH'では、それは重要な高さです。 – dimo414

関連する問題