18

レイアウト希望

私は自分の 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);
     }
}

"new Display(start)" - これは jpanel を拡張したもので、基本的にすべてのグラフィックを描画する場所です。

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

4

2 に答える 2

36

JPanel、実際には、さまざまな要素 (他の も含む) を入れることができるコンテナーにすぎませんJPanels。したがって、あなたの場合、ウィンドウのメインコンテナJPanelのような大きなものをお勧めします。ニーズに合ったメイン パネルを割り当てます (ここでは、レイアウトの概要を説明します)。Layout

メイン パネルにレイアウトを設定したら、ペイント パネルとその他の必要な 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 を使用してプログラムを作成することもできます。そこには、あらゆる種類のウィンドウとフレームを作成するための非常に簡単なビジュアル エディター (ドラッグ アンド ドロップ) があります。(後でコードを理解するだけでは... 難しい場合があります。)

編集

この質問に興味を持っている人が何人かいるので、OPが望んでいるように見えるようにJFrameをレイアウトする方法の完全な例を提供したいと思いました。

このクラスはMyFrameと呼ばれ、swings 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);
            }
        });
    }
}

これは単なる例であり、ウィンドウをレイアウトするには複数の方法があることに注意してください。それはすべて、ニーズと、コンテンツのサイズを変更可能/レスポンシブにするかどうかによって異なります。もう 1 つの非常に優れたアプローチは、非常に複雑なレイアウトを処理できるGridBagLayoutですが、習得するのも非常に複雑です。

于 2013-03-29T00:13:01.387 に答える
2

必要な基本的な結果を得るために、多くのレイアウト マネージャーを使用する必要があります。

比較については、A Visual Guide to Layout Managersを参照してください。

を使用することもできますが、GridBagLayoutこれは JDK で使用できる最も複雑な (そして強力な) レイアウト マネージャーの 1 つです。

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

JPanelを使用して、グラフィック コンポーネントとテキスト領域を単一の に配置BorderLayoutし、グラフィック コンポーネントを に配置CENTERし、テキスト領域を のSOUTH位置に配置します。

テキストフィールドとボタンを別々に配置しますJPanelGridBagLayoutこれは、必要な結果を得るために考えることができる最も簡単な方法だからです)

これら 2 つのパネルを を使用して 3 番目のマスター パネルに配置BorderLayoutし、最初のパネルを にCENTER、2 番目のパネルを のSOUTH位置に配置します。

しかし、それは私です

于 2013-03-29T00:25:13.977 に答える