私は自分でJavaソケットゲームを作成しています。私のゲームはフルスクリーン(「ここにグラフィックをペイント」と表示されていますが、瞬間)。のみテキストを表示するためのスクロールバー付きのテキストボックスを追加し、入力を受け取らず、ユーザーからテキスト入力を受け取る別のテキストボックスを追加し、テキストを送信するためのボタンをチャットに追加しますしかし、私の質問に、どのようにこれをレイアウトし始めますか?レイアウトが必要だと理解していますが、誰かがこれを手伝ってもらえますか?ここに私のコードがあります(このコードは画面全体にペイントを設定するだけです現時点では、上の写真のように画面を分割する必要があります):
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を拡張し、基本的にはすべてのグラフィックを賢くペイントします。
さらに、私は人々が異なるパネルに追加するのを見てきましたが、それらを同じサイズにすることはできません。写真のように、「Paint graphics here」パネルが最大のものです。
JPanel
は、実際には、別の要素(他のJPanels
であっても)を入れることができるコンテナーにすぎません。したがって、あなたの場合、あなたのウィンドウの何らかのメインコンテナとして1つの大きな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の下部に別のレイアウト(水平レイアウトなど)で整理する必要がある他のもの(いくつかのアイコンまたはボタン)が必要な場合は、againを作成するだけです他のすべてのもののコンテナとしての新しいJPanelおよびsetLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS)
を設定します。
後でわかるように、レイアウトは非常に厳格であり、パネルに最適なレイアウトを見つけるのは難しいかもしれません。 Soめないで、紹介(上記のリンク)を読み、写真を見てください。これが私がやる方法です:)
または、NetBeansを使用してプログラムを作成することもできます。そこには、非常に簡単なビジュアルエディター(ドラッグアンドドロップ)があり、あらゆる種類のWindowsとフレームを作成できます。 (あとでコードを理解するだけでは...時々注意が必要です。)
この質問に興味を持っている多くの人々がいるので、私はOPが望むように見えるようにJFrameをレイアウトする方法の完全な例を提供したかったです。
クラスは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 です。これは非常に複雑なレイアウトを処理できますが、学習するのも非常に複雑です。
必要な基本結果を達成するために、いくつかのレイアウトマネージャーを使用する必要があります。
レイアウトマネージャーのビジュアルガイド を比較してください。
GridBagLayout
を使用できますが、これはJDKで利用できる最も複雑な(かつ強力な)レイアウトマネージャーの1つです。
代わりに、一連の複合レイアウトマネージャーを使用できます。
グラフィックコンポーネントとテキスト領域を単一のJPanel
に配置し、BorderLayout
を使用して、グラフィックコンポーネントをCENTER
に、テキスト領域をSOUTH
位置。
JPanel
を使用して、テキストフィールドとボタンを別のGridBagLayout
に配置します(必要以上の結果を達成するために考えることが最も簡単だからです)
BorderLayout
を使用してこれらの2つのパネルを3番目のマスターパネルに配置し、最初のパネルをCENTER
に、2番目のパネルをSOUTH
の位置に配置します。
しかし、それは私です