2013-03-28 13 views
14

Layout wantedjFrameに複数のパネルをレイアウトする方法は?

私は自分自身のJavaソケットゲームを作っています。私のゲームは全画面に完全にペイントされています(ここでは「ペイントグラフィックス」と書かれていますが、現時点ではjframe全体にペイントしています)。私はのテキストだけを表示するためのスクロールバー付きのテキストボックスを追加したいと思います。チャットの目的で、ユーザーからのテキスト入力を受け取るテキストボックスとテキストを送信するテキストボックスを取っていません。しかし、私の質問に、私はどのようにこれを敷設し始めますか?私はレイアウトが必要だと理解していますが、誰かが私を助けることができますか? (

public class Setup extends JFrame implements Runnable{ 
    JPanel panel; 
    JFrame window; 
    public Setup(Starter start, JFrame window){ 
     window.setSize(600,500); 
     window.setLocationRelativeTo(null); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setResizable(false); 
     panel = new Display(start); 
     this.window = window; 
    } 
    public void run(){ 
     window.getContentPane().add(panel); 
     window.setBackground(Color.BLACK); 
     window.setVisible(true); 
    } 
} 

「新しい表示を開始する:ここでは現時点では私のコードがある(このコードは、私が上の写真で持っているように、今の画面を分割する必要があり、現時点では画面全体に絵を設定します) ) " - これはjpanelを拡張しています。

さらに、私は人々が異なるパネルに追加するのを見ましたが、それらは同じサイズにすることはできません。絵のように、ここの「ペイントグラフィックス」パネルが最大のものです。

答えて

23

JPanelは、実際には異なる要素(それ以外のJPanelsも)を入れることができるコンテナです。あなたのケースでは、あなたの窓のためにメインコンテナのいくつかの並べ替えとして1つの大きなJPanelをお勧めします。そのメインパネルあなたのニーズに合うLayoutを割り当てます(here is an introduction to the layouts)。

あなたメインパネルにレイアウトを設定した後あなたは(その内のテキストを持つもののような...)ペイントパネルして、必要な他のJPanelを追加することができます。

JPanel mainPanel = new JPanel(); 
    mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

    JPanel paintPanel = new JPanel(); 
    JPanel textPanel = new JPanel(); 

    mainPanel.add(paintPanel); 
    mainPanel.add(textPanel); 

これは単に、すべての副パネル垂直(Y軸)をソートする例です。したがって、別のレイアウト(水平レイアウトなど)で整理する必要があるmainPanel(いくつかのアイコンやボタンなど)の下部に他のものを追加する場合は、をもう一度作成します。他のすべてのもののコンテナとして新しいJPanel setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS)と設定します。

あなたが分かるように、レイアウトは非常に堅く、パネルに最適なレイアウトを見つけるのは難しいかもしれません。あきらめないでください。上記のリンクを読んで、写真を見てください。これは私がやる方法です。

または、NetBeansを使ってプログラムを書くことができます。そこにあなたは非常に簡単なビジュアルエディタ(ドラッグアンドドロップ)のすべての種類のWindowsとフレームを作成しています。 (唯一のトリッキー時々...その後されているコードを理解すること。)

EDIT

この質問に興味を持って、いくつかの多くの人々があるので、私はそれを作るためにJFrameのをレイアウトする方法の完全な例を提供したかったですOPがそれを望んでいるように見える。クラスはをMyFrameと呼ばれ、スイングJFrameの

public class MyFrame extends javax.swing.JFrame{ 

    // these are the components we need. 
    private final JSplitPane splitPane; // split the window in top and bottom 
    private final JPanel topPanel;  // container panel for the top 
    private final JPanel bottomPanel; // container panel for the bottom 
    private final JScrollPane scrollPane; // makes the text scrollable 
    private final JTextArea textArea;  // the text 
    private final JPanel inputPanel;  // under the text a container for all the input elements 
    private final JTextField textField; // a textField for the text the user inputs 
    private final JButton button;   // and a "send" button 

    public MyFrame(){ 

     // first, lets create the containers: 
     // the splitPane devides the window in two components (here: top and bottom) 
     // users can then move the devider and decide how much of the top component 
     // and how much of the bottom component they want to see. 
     splitPane = new JSplitPane(); 

     topPanel = new JPanel();   // our top component 
     bottomPanel = new JPanel();  // our bottom component 

     // in our bottom panel we want the text area and the input components 
     scrollPane = new JScrollPane(); // this scrollPane is used to make the text area scrollable 
     textArea = new JTextArea();  // this text area will be put inside the scrollPane 

     // the input components will be put in a separate panel 
     inputPanel = new JPanel(); 
     textField = new JTextField(); // first the input field where the user can type his text 
     button = new JButton("send"); // and a button at the right, to send the text 

     // now lets define the default size of our window and its layout: 
     setPreferredSize(new Dimension(400, 400));  // let's open the window with a default size of 400x400 pixels 
     // the contentPane is the container that holds all our components 
     getContentPane().setLayout(new GridLayout()); // the default GridLayout is like a grid with 1 column and 1 row, 
     // we only add one element to the window itself 
     getContentPane().add(splitPane);    // due to the GridLayout, our splitPane will now fill the whole window 

     // let's configure our splitPane: 
     splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); // we want it to split the window verticaly 
     splitPane.setDividerLocation(200);     // the initial position of the divider is 200 (our window is 400 pixels high) 
     splitPane.setTopComponent(topPanel);     // at the top we want our "topPanel" 
     splitPane.setBottomComponent(bottomPanel);   // and at the bottom we want our "bottomPanel" 

     // our topPanel doesn't need anymore for this example. Whatever you want it to contain, you can add it here 
     bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.Y_AXIS)); // BoxLayout.Y_AXIS will arrange the content vertically 

     bottomPanel.add(scrollPane);    // first we add the scrollPane to the bottomPanel, so it is at the top 
     scrollPane.setViewportView(textArea);  // the scrollPane should make the textArea scrollable, so we define the viewport 
     bottomPanel.add(inputPanel);    // then we add the inputPanel to the bottomPanel, so it under the scrollPane/textArea 

     // let's set the maximum size of the inputPanel, so it doesn't get too big when the user resizes the window 
     inputPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 75));  // we set the max height to 75 and the max width to (almost) unlimited 
     inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.X_AXIS)); // X_Axis will arrange the content horizontally 

     inputPanel.add(textField);  // left will be the textField 
     inputPanel.add(button);   // and right the "send" button 

     pack(); // calling pack() at the end, will ensure that every layout and size we just defined gets applied before the stuff becomes visible 
    } 

    public static void main(String args[]){ 
     EventQueue.invokeLater(new Runnable(){ 
      @Override 
      public void run(){ 
       new MyFrame().setVisible(true); 
      } 
     }); 
    } 
} 

を拡張している

これは一例に過ぎないし、ウィンドウをレイアウトする複数のアプローチがあることに注意してください。それはあなたのニーズに左右されます。また、コンテンツのサイズ変更/応答が必要な場合もあります。本当に良いアプローチは、非常に複雑なレイアウトを扱うことができるGridBagLayoutでしょうが、これもまた学習するのは非常に複雑です。

1

多くのレイアウトマネージャを使用して、必要な基本的な結果を得ることができます。

比較のためA Visual Guide to Layout Managersをチェックしてください。

GridBagLayoutを使用できますが、これはJDKで使用可能な最も複雑で強力なレイアウトマネージャの1つです。

代わりに、一連の複合レイアウトマネージャを使用できます。

私はCENTER内のグラフィックス・コンポーネントとSOUTH位置にあるテキストエリアで、BorderLayoutを使用して、単一JPanel上のグラフィックコンポーネントとテキスト領域を置くと思います。

(それはあなたが望む以上の結果を達成するために私は考えることができる最も簡単なので)私はGridBagLayoutを使用して別のJPanel

をテキストフィールドやボタンを配置したい私は上にこれら二つのパネルを配置したいです第2のパネルはSOUTHポジションにあり、BorderLayoutを使用して、第3のマスター、パネル、CENTERの第1のパネルを有する。

しかし、それはdownvoteの理由に光を当てるためのいずれかの願い私

+0

だ、私は1つの答えを改善する方法を学ぶのが大好きです – MadProgrammer

関連する問題