2017-10-29 16 views
0

할당이 있으며 지침에 따라 화면 중앙에 두 개의 레이블이 필요합니다 (수평 및 수직 모두).
이 질문은 여러 번 물어 왔지만이 질문을 검색 할 때마다 주어진 솔루션은 BoxLayout과 같은 다른 레이아웃 관리자를 사용하는 경우가 많습니다. 그러나 지침에서는 BorderLayout을 사용해야한다고 명시합니다.
원래 레이블을 패널에 추가하지 않고 대신 프레임에 직접 추가했지만 작동하지 않으므로 두 가지 모두를 작동하지 않는 JPanel에 둘 것을 권장했습니다.자바 스윙 - 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에 라벨을 추가하기 만하면됩니다. 첫 번째 레이블은 두 번째 레이블 gridx = 0gridy = 1있을 것이다 gridx = 0gridy = 0을해야합니다. 두 번째는 (내가 Insets.top 5 개 픽셀을 사용하여 아래의 코드에서) 당신은 어떤 빈 공간을 만들 insets를 사용하여 정확히 첫 번째 아래에있을 것입니다. 당신의 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이 있어야합니다. 원하는 것을 성취하기가 매우 어렵지만, 말했듯이 그것은 미친 요구 사항입니다.