2017-03-14 22 views
0

JavaでSwingコンポーネントを使用して簡単なGUIを作成しようとしています。しかし、一部のコンポーネントは他のコンポーネントのサイズのために中心から外れています。私はGridBagConstraints.CENTERを使用してこれらのコンポーネントを中心に置いていますが、それらは内部に含まれるGridセルに対してのみ中央に置かれているようです。JavaでGridBagLayoutを使用しているときにSwingコンポーネントが中心にならないようにする

私が持っている特定の問題は以下の通りです。私はJTextFieldを "File Name:"の横にある長さにする必要があります。しかし、これを一定の長さにすると、他の行の他のコンポーネントがオフセンタリングされます。すべてのコンポーネントを中央に維持する唯一の方法は、両方のJTextFieldを同じ長さにすることです。

私はSwingとJava GUIの一般的な新機能ですので、いくつかの基本的な概念が不足している可能性がありますが、この特定の質問に対する回答はまだありません。

Image Showing the Components becoming Off-Centered when the JTextField length changes

>

//Initialize global Swing objects 
JFrame frame = new JFrame("Game Server V2.0 build 019827427"); 
JPanel panel = new JPanel(); 
JButton runButton = new JButton("Start Server"); 
JButton stopButton = new JButton("Stop Server"); 
JButton sendButton = new JButton("Send File"); 
JTextField portField = new JTextField("999", 5); 
JTextField fileField = new JTextField("fileToSend.txt", 14); 
JLabel portLabel = new JLabel("Port: "); 
JLabel fileLabel = new JLabel("File Name: "); 
JLabel statusLabel = new JLabel("Status: Disconnected"); 

public void run(){ 

    //Set layout and constraints 
    panel.setLayout(new GridBagLayout()); 
    GridBagConstraints gc = new GridBagConstraints(); 

    //Add Swing components to panel using GridBagLayout with the GridBagConstraints we've specified 
    gc.weightx = 0.5; 
    gc.weighty = 0.5; 

    gc.gridx = 0; 
    gc.gridy = 0; 
    gc.gridwidth = 1; 
    gc.anchor = GridBagConstraints.LINE_END; 
    panel.add(portLabel, gc); 

    gc.gridx = 1; 
    gc.gridy = 0; 
    gc.gridwidth = 1; 
    gc.anchor = GridBagConstraints.LINE_START; 
    panel.add(portField, gc); 

    gc.gridx = 0; 
    gc.gridy = 1; 
    gc.gridwidth = 1; 
    gc.anchor = GridBagConstraints.LINE_END; 
    panel.add(fileLabel, gc); 

    gc.gridx = 1; 
    gc.gridy = 1; 
    gc.gridwidth = 1; 
    gc.anchor = GridBagConstraints.LINE_START; 
    panel.add(fileField, gc); 

    gc.gridx = 0; 
    gc.gridy = 2; 
    gc.gridwidth = 2; 
    gc.anchor = GridBagConstraints.CENTER; 
    panel.add(sendButton, gc); 

    gc.gridx = 0; 
    gc.gridy = 3; 
    gc.gridwidth = 1; 
    panel.add(runButton, gc); 

    gc.gridx = 1; 
    gc.gridy = 3; 
    gc.gridwidth = 1; 
    panel.add(stopButton, gc); 

    gc.gridx = 0; 
    gc.gridy = 4; 
    gc.gridwidth = 2; 
    panel.add(statusLabel, gc); 

    frame.add(panel); 
    frame.setSize(480, 280); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

} 
+0

GridBagContraints.CENTERは、セル内のコンポーネント中心を(垂直方向および水平方向に)センタリングするように設計されています。 –

+0

frame.setSizeを 'frame.pack()'に置き換えてください。 GridBagLayoutにコンポーネントを配置するための十分なスペースがありません。 – VGR

+0

'しかし、それはそれらが含まれているグリッドセルに対してのみ中央に置かれているように見えます。 - 正しい、コンポーネントはセル内に配置されます。私はあなたのことを「中心に置いて」意味しているのか分かりません。コンポーネントの表示方法を示すASCIIダイアグラムを描画します。セルの左端に「スタート」ボタンが表示され、右端に「停止」ボタンが表示されますか? – camickr

答えて

0

を余分なスペースを受けるべきである私が本当に望んだものを推測それではあなたは「スタートを持っている必要があり

、同じ幅であるように、細胞の両方の列のためであります"と"停止 "ボタンをそれぞれの列に表示します。次に、1.0の重み付けをして展開できるようにする必要があります。それらは中心に置くべきです。

注:開始ボタンの幅が停止ボタンよりわずかに大きいため、正確に中央に配置されないため、余分なスペースが必要になります。

他のすべてのデータ行については、各行に単一のコンポーネントを追加する必要があります。各コンポーネントは2のグリッド幅を必要とします。各コンポーネントは中央に配置されます。最初の2行には2つのコンポーネントが含まれているため、パネルを作成してパネルに追加する必要があります。次に、GridBagLayoutを使用してパネルをパネルに追加します。

0

gbc.gridweightxgbc.gridweightygbc.fillNoneであれば意味がありません。フィールドだけが(fill == HORIZONTAL and weightx != 0

+0

あなたが言っていることは真実ではありません。コンポーネントに余分なスペースを与えて、制約のアンカーを変更すると、そのコンポーネントがある場所に表示されないことがわかります。 –

+0

あなたは正しいですが、それは一般的に望むものではありません。私は「無意味」ではなく「無駄」と言いました。 –

関連する問題