2016-03-25 20 views
1

フレームがあり、このフレームの中にボックスレイアウトのパネルがあります。このパネルにはさらに4つのパネルがあります。ボックスレイアウトのコンポーネントのカスタム位置を設定

 mainFrame = new JFrame("Basket Game"); 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     mainPanel.add(options); 
     mainPanel.add(pname); 
     mainPanel.add(info); 
     mainPanel.add(gamearea);  

    mainFrame.setContentPane(mainPanel); 
    mainFrame.pack(); 
    mainFrame.getContentPane().setBackground(Color.LIGHT_GRAY); 
    mainFrame.setResizable(false); 
    mainFrame.setVisible(true); 
    mainFrame.setSize(600,600); 

形式は次のようになります。

form

最初の3パネルには、私のためokです。しかし、最後のパネル(黒いパネル)では、カスタム座標を持つコンポーネントをいくつか追加したいと思います。私はカスタムでそれらを追加しようとする。しかし座標:それは私がgameareI秒を設定し、パネルの直接上部中央を(座標が、それは場所だ影響しません)

second

行く

basket.setLocation(500, 500); 
gamearea.add(basket); 

layout to nullパネル上にラベルが表示されません。私はそれのために余分な何かをするべきだと思う。どうやってやるの?

+0

メインウィンドウは600×600です。タイトルバー、オプション、プレーヤー名、および情報では、おそらくy = 500がペインの下に表示されます。 – AJNeufeld

+0

レイアウトマネージャの仕組みを理解していますか?レイアウトマネージャが持つ責任を理解していますか? APIのリセットがレイアウトマネージャと対話するのは誰ですか?そうしないと、nullレイアウトがあなたが探している選択肢ではありません。ほとんどの場合、ヌルレイアウトが必要だと思うときは、おそらくそうではありません。まれなケースでは、ヌルレイアウトが役立つかもしれません。カスタムレイアウトでは、問題や再作業がはるかに少なくなります。 – MadProgrammer

答えて

1

あなたのレイアウトマネージャ(null)に問題はありません。問題は単純に500x500が範囲外のgame areaです。 400400でBasketが表示されていないこと

public class NullLayout { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(NullLayout::new); 
    } 

    NullLayout() { 
     JFrame frame = new JFrame("Basket Game"); 
     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     for (int i = 0; i < 4; i++) { 
      JPanel strip = new JPanel(); 
      strip.setMaximumSize(new Dimension(Integer.MAX_VALUE, 50)); 
      strip.setBorder(BorderFactory.createTitledBorder("Strip " + i)); 
      strip.add(new JLabel("Strip " + i)); 
      mainPanel.add(strip); 
     } 

     JPanel gamearea = new JPanel(); 
     gamearea.setLayout(null); 
     mainPanel.add(gamearea); 

     for (int i = 0; i < 5; i++) { 
      int x = i * 100, y = i * 100; 
      JPanel basket = new JPanel(); 
      basket.setSize(200, 50); 
      basket.setLocation(x, y); 
      basket.setBackground(Color.YELLOW); 
      basket.add(new JLabel("x = " + x + ", y = " + y)); 
      gamearea.add(basket); 
     } 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(mainPanel); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setSize(600, 600); 

     frame.setVisible(true); 
    } 
} 

Basket showing (0,0), to (300,300), but not (400,400)

お知らせ。それはゲームエリアの底から外れるだろう。

0

ヌルレイアウトを使用することはほとんど常に間違っています。ユーザーが必要な場所にコンポーネントを配置するのに役立つLayoutManagerを使用する必要があります。ユーザーがメインフレームのサイズを変更する場合は特に便利です。 GridBagまたはMigレイアウトを使用します。

ヌルレイアウトの使用を絶対に要求する場合は、JPanelを拡張する新しいGameAreaクラスを作成し、paintComponent()メソッドをオーバーライドし、child.setBounds(...)を使用して子の位置を設定します。オーバーライドされたメソッドの最初のステートメントがsuper.paintComponent(g);であることを確認してください。

+0

「ヌル」レイアウトが許可されています。 https://docs.oracle.com/javase/tutorial/uiswing/layout/none.html – AJNeufeld

+0

さらに、 'mainFrame.setResizable(false);'がコールされているため、ユーザーはウィンドウのサイズを変更できません。 – AJNeufeld

+0

@AJNeufeld「許可」されているかもしれませんが、大いに落胆して、必要と思うかもしれません。 Swing API全体がレイアウトAPIの周りに書かれています。廃棄すると、開発者は大部分の責任を負うことになります。そのほとんどは対処する準備ができていません。 – MadProgrammer

関連する問題