2017-01-05 5 views
0

좋아, 그래서 상자 레이아웃을 테스트 해보고 싶습니다. layout help page에 정렬을 줄 수 있다고 지정했는데, 그게 바로 시도했지만 전혀 작동하지 않는 것 같습니다.Boxlayout 맞춤 정렬하지 않겠습니까

package gameflow; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class LoginScreen extends JFrame 
{ 
    private static final Dimension SCREENSIZE = Toolkit.getDefaultToolkit().getScreenSize(); 
    private static final double DEFAULTHEIGHT = (SCREENSIZE.getHeight() * 80)/100; 
    private static final double DEFAULTWIDTH = (SCREENSIZE.getWidth() * 80)/100; 
    private static final long serialVersionUID = -7245840869407664992L; 
    private JTextField userfield = new JTextField(), passfield = new JTextField(); 
    private JLabel userlabel = new JLabel("Username"), passlabel = new JLabel("Password"); 
    private static final Dimension fieldSize = new Dimension(); 

    public LoginScreen() 
    { 
     super("Wraith: the game"); 
     setBounds((SCREENSIZE.width * 10)/100, (SCREENSIZE.height * 10)/100,(int)DEFAULTWIDTH,(int)DEFAULTHEIGHT); 
     fieldSize.setSize((double)this.getWidth()/2,(double)this.getHeight()/30); 

     userfield.setMaximumSize(fieldSize); 
     userfield.setForeground(new Color(1f,1f,1f)); 

     passfield.setMaximumSize(fieldSize); 
     passfield.setForeground(new Color(1f,1f,1f)); 

     userlabel.setMaximumSize(fieldSize); 
     passlabel.setMaximumSize(fieldSize); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 
     panel.setBackground(new Color(0f,0f,0f)); 
     panel.setAlignmentX(0.5f); 

     panel.add(userlabel); 
     panel.add(userfield); 
     panel.add(passlabel); 
     panel.add(passfield); 
     this.add(panel, BorderLayout.CENTER); 
    } 
} 

패널에서 볼 수 있듯이 Panel에는 BorderLayout이있는 JFrame의 boxlayout이 있으며 구성 요소는 가운데 정렬되지 않습니다. 왜? 수는 구성 요소가 약 10 문자를 표시 할 적절한 사이즈를 결정 할 수

JTextField textField = new JTextField(10); 

: 모든

+0

현재와 같이 모든 구성 요소의 왼쪽 가장자리가 동일합니다. 패널에서 setAlignment를 호출하면 개별 구성 요소에 영향을 미치지 않습니다. – MeBigFatGuy

+0

글쎄, 내가 어떻게 그럴 수 있니? – Delupara

+0

폼에 대해 BoxLayout을 통해 SpringLayout을 살펴 보겠습니다. 또는 심지어 miglayout. https://docs.oracle.com/javase/tutorial/uiswing/layout/spring.html – MeBigFatGuy

답변

1

먼저 당신이 사용해야하는 텍스트 필드를 만들 때. 그러나, 컴포넌트의 실제 크기는 레이아웃 관리자에 의해 결정될 수있다.

구성 요소는 가운데 정렬되지 않습니다. 왜?

이것은 BoxLayout의 규칙이므로. 패널이 JFrameBorderLayout에 추가되면 패널이 프레임의 전체 영역을 채우도록 크기가 조절됩니다. 따라서 BoxLayout은 규칙을 기반으로 사용 가능한 공간을 채우기 위해 구성 요소의 크기를 조정합니다.

먼저 각 구성 요소가 적절한 높이로 표시되고 추가 공간이 패널 하단에 추가됩니다. 모든 구성 요소가 프레임 상단에 나타납니다.

패널에서 구성 요소를 수직 가운데에 배치하려면 패널의 상단과 하단에 "접착제"를 추가해야합니다. 그런 다음 빈 공간이 구성 요소의 위/아래에 추가되어 가운데에 나타나게됩니다. "접착제"가 작동하는 방법에 대한 자습서 링크를 다시 읽어보십시오.

다음은 구성 요소의 가로 크기가 패널의 너비를 채우도록 조정됩니다. 구성 요소는 최대 너비까지만 채워집니다. 많은 컴퍼넌트 (label, button ...)에서는, 최대폭이 적절한 폭입니다 만, 일부의 컴퍼넌트 (텍스트 컴퍼넌트)는 최대폭을 가지지 않습니다. 사용하여 당신이 성장에서 텍스트 필드를 방지 할 수 있습니다

theComponent.setAlignment(0.5f); 

텍스트 필드의 경우 :

그래서 당신이 사용하는 각 구성 요소의 정렬을 설정해야 수평 구성 요소를 중앙에

textField.setMaximumSize(textField.getPreferredSize()); 

따라서 이러한 속성을 실험하여 다른 효과를 확인하십시오.

이러한 모든 것을 말하면, 프레임에 패널을 (수직 및 수평으로) 가운데에 배치하는 가장 쉬운 방법은 프레임의 내용 창에서 GridBagLayout을 사용하는 것입니다. 그러면 코드는 다음과 같습니다.

setLayout(new GridBagLayout()); 
add(panel, new GridBagConstraints()); 

이제 패널은 원하는 크기로 프레임 중앙에 배치됩니다.

관련 문제