2012-08-06 8 views
0

다른 이유로 인해 패널을 세로로 가운데에 배치하는 데 문제가 있습니다. 나는 공부 한 예와 똑같지 만 여전히 운이 없다.자바 센터링 패널

내 코드가 있습니다. 내 컨테이너 패널에서 setAlignmentY (0.5f)를 사용 했음에도 불구하고 윈도우 크기를 조정하면 여전히 중앙에 배치되지 않습니다.

또한 컨테이너 패널 내부의 구성 요소는 setAligenmentX (0.5f)에도 불구하고 가운데에 배치되지 않습니다.

나는 이것에 대한 해결책이 있는지 궁금해하는데, 나는 거의 모든 것을 거기 밖으로 시도했지만 해결책을 찾을 수 없었다.

JLabel idLabel; 
    JLabel passLabel; 
    JTextField id; 
    JTextField pass; 
    JButton enter; 
    JPanel container; 

    public JournalLogin() 
    { 
     //setLayout(new FlowLayout()); 
     //setPreferredSize(new Dimension(500, 500)); 
     //setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100)); 


     container = new JPanel(); 
     container.setLayout(new MigLayout()); 
     container.setAlignmentX(0.5f); 
     container.setAlignmentY(0.5f); 
     container.setPreferredSize(new Dimension(300, 300)); 
     container.setBorder(BorderFactory.createTitledBorder("Login")); 
     add(container); 

     idLabel = new JLabel("ID:"); 
     idLabel.setAlignmentX(0.5f); 
     container.add(idLabel); 

     id = new JTextField(); 
     id.setText("id"); 
     id.setAlignmentX(0.5f); 
     id.setPreferredSize(new Dimension(80, 20)); 
     container.add(id, "wrap"); 

답변

2

setAlignmentX 및 Y는이 작업을 수행하는 방법이 아닙니다. 컨테이너에 컴포넌트를 중앙에 배치하는 한 가지 방법은 컨테이너에 GridBagLayout을 사용하고 GridBagConstraints를 사용하지 않고 컴포넌트를 추가하는 것입니다. 다른 방법들도 있습니다. 또한, 그것은 단지 수평뿐만 아니라 objcets을 중심으로 MigLayout ("센터") 시도

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridBagLayout; 

import javax.swing.*; 

public class UpdatePane2 extends JPanel { 
    private static final int PREF_W = 300; 
    private static final int PREF_H = 200; 

    public UpdatePane2() { 
     JPanel innerPanel = new JPanel(); 
     innerPanel.setLayout(new BorderLayout()); 
     innerPanel.add(new JLabel("Hi Mom", SwingConstants.CENTER), 
      BorderLayout.NORTH); 
     innerPanel.add(new JButton("Click Me"), BorderLayout.CENTER); 

     setLayout(new GridBagLayout()); 
     add(innerPanel); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("UpdatePane2"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new UpdatePane2()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

대단히 고맙습니다. GridBagLayout을 사용하여 제 문제를 해결했습니다. 비록 내가 아직도 setAlignmentX와 setAlignment가해야 할 것을 알아낼 수는 없었지만. – harbinger

1

레이아웃을 가운데 정렬하려면 LayoutManager를 가져와야합니다. 현재 "MigLayout"구현은 정렬을 존중하지 않는 것 같습니다. 변경하거나 서브 클래스를 작성하십시오.

+0

: 예를 들어

닉 Rippe의 예 (그에게 1+)을 변경합니다. 내가 잃어버린 뭔가가 있어야한다. 내가 무엇을 시도하든 관계없이 구성 요소를 세로로 가운데에 배치 할 수 없습니다. – harbinger

2

스윙에서 정렬은 꽤 까다 롭습니다. 일반적으로 작동합니다 ...하지만 원하는 것이 모두 중앙에 배치 된 패널 인 경우 BoxLayout (내 개인 즐겨 찾기 LayoutManager)의 상자를 사용하는 것이 좋습니다.). 다음은 시작하기위한 예입니다.

import java.awt.Dimension; 
import javax.swing.*; 

public class UpdatePane extends JPanel{ 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run() { 
       //Create Buffers 
       Box verticalBuffer = Box.createVerticalBox(); 
       Box horizontalBuffer = Box.createHorizontalBox(); 

       verticalBuffer.add(Box.createVerticalGlue()); //Top vertical buffer 
       verticalBuffer.add(horizontalBuffer); 

       horizontalBuffer.add(Box.createHorizontalGlue()); //Left horizontal buffer 

       //Add all your content here 
       Box mainContent = Box.createVerticalBox(); 
       mainContent.add(new JLabel("Hi Mom!")); 
       mainContent.add(new JButton("Click me")); 
       horizontalBuffer.add(mainContent); 

       horizontalBuffer.add(Box.createHorizontalGlue()); //Right horizontal buffer 
       verticalBuffer.add(Box.createVerticalGlue()); //Bottom vertical buffer 


       // Other stuff for making the GUI 
       verticalBuffer.setPreferredSize(new Dimension(300,200)); 
       JFrame frame = new JFrame(); 
       frame.add(verticalBuffer); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.pack(); 
       frame.setVisible(true); 

      } 
     }); 
     } 

}