2017-10-29 27 views
0

私は割り当てを持っています。指示には、2つのラベルを画面の中央に配置する必要があります(水平と垂直の両方)。
私はこの質問が何度も聞かれたことは知っていますが、この質問を検索するたびに、BoxLayoutのような異なるレイアウトマネージャを使用することがよくあります。ただし、この指示ではBorderLayoutを使用する必要があることも示しています。
元々は、ラベルをパネルに追加せず、代わりにフレームに直接追加しましたが、これはうまくいかなかったため、どちらも機能していないJPanelにそれらを配置するように指示されました。Java Swing - BorderLayoutを使用してJLabelを中心にする

は私のコードは、現在、次のようになります。

JButton butSubmit = new JButton("Submit"); 
    JButton butReset = new JButton("Reset"); 

    JLabel nameAndReg = new JLabel("My details", SwingConstants.CENTER); 
    JLabel errorMsg = new JLabel("The error message", SwingConstants.CENTER); 
    nameAndReg.setForeground(Color.blue); 

    JTextField redVal = new JTextField(3); 
    JTextField greenVal = new JTextField(3); 
    JTextField blueVal = new JTextField(3); 

    JPanel butPanelSouth = new JPanel(); 
    JPanel butPanelNorth = new JPanel(); 
    JPanel labsPanel = new JPanel(); 

    butPanelSouth.add(redVal); 
    butPanelSouth.add(greenVal); 
    butPanelSouth.add(blueVal); 
    butPanelSouth.add(butSubmit); 
    butPanelNorth.add(butReset); 
    labsPanel.add(nameAndReg, BorderLayout.CENTER); 
    labsPanel.add(errorMsg, BorderLayout.CENTER); 

    add(labsPanel, BorderLayout.CENTER); 
    add(butPanelNorth, BorderLayout.NORTH); 
    add(butPanelSouth, BorderLayout.SOUTH); 

をそして、これはそれが生成するものである: Current result
は、どのように私は「私の詳細」と「エラーメッセージ」は垂直方向と水平方向であることを得ることができますウィンドウの中央、もう一方は下にあり、それでもBorderLayoutを使用していますか?

編集:申し訳ありませんが、私は非常に明確ではなかったことを実感します。私が与えられた助言は、おそらくあなたのレイアウトマネージャを入れ子にする、つまりJPanelをJFrameのBorderLayoutの中心に置くことでした。

+0

テキストのためにあなたのJLabelが中央にないと仮定していますか? JLabelのバックカラーを変更して、JLabel全体が最初に配置されている場所を確認することができます。すでにすべてのアプローチを試してみたら、すでに中心にあるかもしれません。 – user3437460

+1

あなたのすべてのパネルは** BorderLayoutを使用しなければなりません(それは狂っています...)、または異なるLayoutManagerを持つネストされたパネルを使用できますか?現在、あなたのサブパネルに 'FlowLayout'を使用しています(' JPanel'コンストラクタにレイアウトを渡さない場合、 'FlowLayout'が使用されます)。 – Ansharja

+0

実際に、私は何をするようにアドバイスされたので、 「おそらくレイアウトマネージャを入れ子にします。つまり、JPanelをJFrameのBorderLayoutの中心に配置します。 – electricbl00

答えて

1

私が上記のコメントで言ったように、「命令ではBorderLayoutを使用する必要があることを指定しています」と言ったときに何を意味するのかを明確にする必要があります。

コンテンツペインにBorderLayoutが必要であり、他のパネルのレイアウトが異なる場合は、サブパネルでFlowLayoutを使用しているため、コード内のようにレイアウトを変更することができます。

JPanelにラベルを追加する必要があります。ラベルを中央に配置するレイアウトを使用します(GridBagLayoutなど)。 あなたの最初のラベルはgridx = 0gridy = 0となり、2番目のラベルはgridx = 0gridy = 1となります。 秒がちょうど最初のものより下になる場合は、insetsを使用して空きスペースを作成することができます(下のコードでは、Insets.topの5ピクセルを使用しています)。あなたのlabsPanelBorderLayout.CENTERになりますので

は、パネルは、あなたのフレーム内のすべての空のスペースを取るだろう、とGridBagConstrains.anchorデフォルト値(GridBagConstrains.CENTERは)あなたのラベルがあなたのlabsPanel内で集中しているを確認します。

enter image description here

コードサンプル:

import java.awt.*; 
import javax.swing.*; 
public class Test 
{ 
    public static void main (String [] a) { 
     SwingUtilities.invokeLater (new Runnable() { 
      @Override public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
    private static void createAndShowGUI() { 
     JFrame frame = new JFrame ("Test"); 
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane (new MainPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo (null); 
     frame.setVisible (true); 
    } 
} 
class MainPanel extends JPanel 
{ 
    public MainPanel() { 
     super (new BorderLayout()); 

     JLabel nameAndReg = new JLabel ("My details", SwingConstants.CENTER); 
     JLabel errorMsg = new JLabel ("The error message", SwingConstants.CENTER); 
     nameAndReg.setForeground(Color.blue); 

     JPanel labsPanel = new JPanel (new GridBagLayout()); 

     labsPanel.add (nameAndReg); 

     GridBagConstraints c = new GridBagConstraints(); 
     c.gridy = 1; 
     c.insets = new Insets (5, 0, 0, 0); 
     labsPanel.add (errorMsg, c); 

     JButton butSubmit = new JButton("Submit"); 
     JButton butReset = new JButton("Reset"); 

     JTextField redVal = new JTextField(3); 
     JTextField greenVal = new JTextField(3); 
     JTextField blueVal = new JTextField(3); 

     JPanel butPanelSouth = new JPanel(); 
     JPanel butPanelNorth = new JPanel(); 

     butPanelSouth.add (redVal); 
     butPanelSouth.add (greenVal); 
     butPanelSouth.add (blueVal); 
     butPanelSouth.add (butSubmit); 

     butPanelNorth.add (butReset); 

     add (labsPanel, BorderLayout.CENTER); 
     add (butPanelNorth, BorderLayout.NORTH); 
     add (butPanelSouth, BorderLayout.SOUTH); 
    } 
} 

場合は、すべてのあなたのパネル垂直方向と水平方向以下screeenshotのように、フレームの中央に整列結果、ラベルがされますBorderLayoutが必要ですが、あなたが望むものを達成することは非常に難しいですが、私が言ったように、それは狂った要求であろう。

関連する問題