使用GridBagLayout Manager将页面右上角的组件对齐

时间:2013-05-21 11:12:41

标签: java swing layout jpanel gridbaglayout

我正在尝试创建一个像facebook一样的登录页面,但是我写的代码并没有在左上角显示它而是显示在页面的中心,我正在使用GridBagLayout和anchore来设置文本FIRST_LINE_END。

final JFrame f2=new JFrame("Admin Main");
                    f2.setSize(1350,730);
                    f2.setVisible(true);
                    f1.setVisible(false);
                    f2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);![enter image description here][2]
                    GridBagLayout gbl=new GridBagLayout();
                    final JPanel p2=new JPanel(gbl){
        private Image img = ImageIO.read(new File("F:\\Untitled Folder\\Rohan\\football2.jpg"));
        @Override
                          protected void paintComponent( Graphics g ) { 
              super.paintComponent(g);

              g.drawImage(img, 0,0,1366,730, null);
              }
       };;
                    GridBagConstraints g2=new GridBagConstraints();
                    g2.insets=new Insets(3,3,3,3);
                    JLabel l2=new JLabel("Admin ID",JLabel.LEFT);
                    JLabel l3=new JLabel("Password",JLabel.LEFT);
                    l2.setFont(new Font("TimesRoman",Font.BOLD,16));
                    l2.setForeground(Color.BLUE);
                    l2.setBackground(Color.WHITE);
                    l3.setFont(new Font("TimesRoman",Font.BOLD,16));
                    l3.setForeground(Color.BLUE);
                    l3.setBackground(Color.WHITE);
                    final JTextField t1=new JTextField(15);
                    final JPasswordField pw1=new JPasswordField(15);
                    JButton b3=new JButton("Back");
                    JButton b4=new JButton("Sign in");
                    f2.add(p2);
                    g2.anchor=GridBagConstraints.FIRST_LINE_END;
                    g2.gridx=1;
                    g2.gridy=1;
                    p2.add(l2,g2);
                    g2.gridx=2;
                    g2.gridy=1;
                    p2.add(t1,g2);
                    g2.gridx=1;
                    g2.gridy=2;
                    p2.add(l3,g2);
                    g2.gridx=2;
                    g2.gridy=2;
                    p2.add(pw1,g2);
                    g2.gridx=1;
                    g2.gridy=3;
                    p2.add(b3,g2);
                    g2.gridx=2;
                    g2.gridy=3;
                    p2.add(b4,g2);

enter image description here

3 个答案:

答案 0 :(得分:7)

我在您当前的布局中看到两个问题:

  1. 您将登录面板放在父BorderLayout的中心(因此您的面板会拉伸到其容器的大小)
  2. GridBagLayout中没有任何内容可以将您的组件“推”到顶部和左侧。
  3. 这里有几个选项:

    1. 您将登录面板嵌套到多个面板中(例如,使用BorderLayout,一次使用约束NORTH,第二次使用约束WEST)。
    2. 将您的loginPanel添加到WEST,然后在GridBagLayout的底部添加“填充”组件,以便将其他组件推送到顶部。
    3. 以下是第二个解决方案的演示:

      import java.awt.BorderLayout;
      import java.awt.Color;
      import java.awt.Dimension;
      import java.awt.FlowLayout;
      import java.awt.Font;
      import java.awt.GridBagConstraints;
      import java.awt.GridBagLayout;
      import java.awt.Insets;
      import java.net.MalformedURLException;
      import java.net.URL;
      
      import javax.swing.Box;
      import javax.swing.ImageIcon;
      import javax.swing.JButton;
      import javax.swing.JFrame;
      import javax.swing.JLabel;
      import javax.swing.JPanel;
      import javax.swing.JPasswordField;
      import javax.swing.JTextField;
      import javax.swing.SwingUtilities;
      
      public class TestLoginGridBagLayout {
      
          protected void initUI() throws MalformedURLException {
              JFrame frame = new JFrame("Admin Main");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              JLabel background = new JLabel(new ImageIcon(new URL(
                      "http://media1.santabanta.com/full1/Football/Football%20Abstract/football-abstract-6a.jpg"))) {
                  @Override
                  public Dimension getPreferredSize() {
                      Dimension preferredSize = super.getPreferredSize();
                      Dimension layoutPreferredSize = super.preferredSize();
                      preferredSize.width = Math.max(preferredSize.width, layoutPreferredSize.width);
                      preferredSize.height = Math.max(preferredSize.height, layoutPreferredSize.height);
                      return preferredSize;
                  }
              };
              background.setLayout(new BorderLayout());
              frame.add(background);
              GridBagLayout gbl = new GridBagLayout();
              final JPanel loginPanel = new JPanel(gbl);
              loginPanel.setOpaque(false);
              background.add(loginPanel, BorderLayout.WEST);
              JLabel adminIDLabel = new JLabel("Admin ID", JLabel.LEFT);
              JLabel passwordLabel = new JLabel("Password", JLabel.LEFT);
              adminIDLabel.setFont(new Font("TimesRoman", Font.BOLD, 16));
              adminIDLabel.setForeground(Color.BLUE);
              adminIDLabel.setBackground(Color.WHITE);
              passwordLabel.setFont(new Font("TimesRoman", Font.BOLD, 16));
              passwordLabel.setForeground(Color.BLUE);
              passwordLabel.setBackground(Color.WHITE);
              final JTextField adminID = new JTextField(15);
              final JPasswordField password = new JPasswordField(15);
              JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
              buttonPanel.setOpaque(false);
              JButton back = new JButton("Back");
              JButton signIn = new JButton("Sign in");
              buttonPanel.add(back);
              buttonPanel.add(signIn);
              GridBagConstraints gbc = new GridBagConstraints();
              gbc.insets = new Insets(3, 3, 3, 3);
              gbc.anchor = GridBagConstraints.FIRST_LINE_END;
              loginPanel.add(adminIDLabel, gbc);
              gbc.gridwidth = GridBagConstraints.REMAINDER;
              loginPanel.add(adminID, gbc);
              gbc.gridwidth = 1;
              loginPanel.add(passwordLabel, gbc);
              gbc.gridwidth = GridBagConstraints.REMAINDER;
              loginPanel.add(password, gbc);
              loginPanel.add(buttonPanel, gbc);
              GridBagConstraints gbcFiller = new GridBagConstraints();
              gbcFiller.weightx = 1.0;
              gbcFiller.weighty = 1.0;
              gbcFiller.fill = GridBagConstraints.BOTH;
              loginPanel.add(Box.createGlue(), gbcFiller);
              frame.pack();
              frame.setVisible(true);
          }
      
          /**
           * @param args
           */
          public static void main(String[] args) {
              SwingUtilities.invokeLater(new Runnable() {
                  @Override
                  public void run() {
                      try {
                          new TestLoginGridBagLayout().initUI();
                      } catch (MalformedURLException e) {
                          e.printStackTrace();
                      }
                  }
              });
          }
      
      }
      

      我也冒昧:

      • 将变量重命名为有意义的名称(使代码更容易为其他人阅读)
      • 将您的自定义背景图片面板替换为JLabel
      • 将您的按钮移动到另一个LayoutManager
      • 的嵌套面板
      • 拍摄另一张背景图片,因为我没有你的照片。

答案 1 :(得分:0)

如果您希望它明确地位于左上角,我宁愿使用NORTHWEST锚点。对于从左到右流动的文本,FIRST_LINE_END也会将文字放在右上角,而另一种方式则是从右到左。

此外,将gridx和gridy切换为 0 而不是 1 。并根据需要从那里增加。

例如:

g2.anchor=GridBagConstraints.NORTHWEST;
g2.gridx=0;
g2.gridy=0;
p2.add(l2,g2);
g2.gridx=1;
g2.gridy=0;
p2.add(t1,g2);
/*And so on for the rest of the block*/

答案 2 :(得分:0)

使用FIRST_LINE_START作为锚值。

g2.anchor=GridBagConstraints.FIRST_LINE_START;