2012-08-06 73 views
0

由于某些原因,我的问题是我的面板垂直位于另一个面板内。我完全按照我研究的例子做,但仍然没有运气。Java中的定心面板

下面是我的代码。尽管在我的容器面板上使用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,即所谓的默认添加。还有其他方法。

例如改变尼克Rippe的例子(1+他):

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和setAlignmentY应该做什么。 – harbinger 2012-08-06 21:30:50

1

您将需要让LayoutManager为您布置中心布局。目前看起来像“MigLayout”的实施不符合对齐。尝试改变它或创建一个子类。

+0

试图MigLayout( “中心”)也一样,它只是居中objcets水平为好。必须有我缺少的东西。因为不管我尝试什么,我都无法垂直居中对齐组件。 – harbinger 2012-08-06 21:10:25

2

对齐在Swing中往往很挑剔 - 他们[通常]工作...但是如果您要查找的是一个以中心为中心的面板,我建议在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); 

      } 
     }); 
     } 

}