将按钮对齐到BoxLayout中心

时间:2015-07-18 03:20:38

标签: java swing layout-manager boxlayout

我正在尝试使用Box.createHorizontalStrut()方法将按钮设置为中心。但是,如果我使用this.getWidth()/2则不起作用。如何将其置于框架中心。

代码

package ch17;
import java.awt.Color;
import java.awt.Container;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class Q17_1 extends JFrame{
    JButton left = new JButton("<=");
    JButton right = new JButton("=>");
    JPanel p1 = new JPanel();
    JRadioButton rb1 = new JRadioButton("Red");
    JRadioButton rb2 = new JRadioButton("Yellow");
    JRadioButton rb3 = new JRadioButton("White");
    JRadioButton rb4 = new JRadioButton("Gray");
    JRadioButton rb5 = new JRadioButton("Green");
    JPanel p2 = new JPanel();
    Message m = new Message("Welcome to Java");
    public Q17_1(){
        setLayout(new GridLayout(3,1));
        p1.setBorder(new TitledBorder("Select Message Panel Background"));
        ButtonGroup group = new ButtonGroup();
        group.add(rb1);group.add(rb2);group.add(rb3);group.add(rb4);group.add(rb5);
        rb1.setMnemonic('R');rb2.setMnemonic('Y');rb3.setMnemonic('W');rb4.setMnemonic('G');
        rb5.setMnemonic('N');
        p1.setLayout(new GridLayout(1,5,5,5));
        p1.add(rb1);p1.add(rb2);p1.add(rb3);p1.add(rb4);p1.add(rb5);
        p2.setLayout(new BoxLayout(p2,BoxLayout.X_AXIS));
        add(p1);
        add(m);
        p2.add(Box.createHorizontalStrut(250));
        p2.add(left); 
        p2.add(Box.createHorizontalStrut(5));
        p2.add(right); 

        add(p2);

        left.addActionListener((ActionEvent) -> {
            m.moveLeft();
            repaint();
        });

        right.addActionListener((ActionEvent)-> {
            m.moveRight();
            repaint();
        });

        rb1.addActionListener(m);
        rb2.addActionListener(m);
        rb3.addActionListener(m);
        rb4.addActionListener(m);
        rb5.addActionListener(m);
    }

    public static void main(String[] args) {
        Q17_1 frame = new Q17_1();
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }


}

我已经尝试过,this.getWidth()/2p2.getWidth()/2等。但它们不起作用,按钮仍然从左侧开始。

1 个答案:

答案 0 :(得分:2)

您可以结合使用BorderlayoutFlowLayoutGridBagLayout

总结:

setLayout(new BorderLayout());
//...
p2.setLayout(new FlowLayout());
add(p1, BorderLayout.NORTH);
add(m);
//...
add(p2, BorderLayout.SOUTH);

我可能会考虑将BorderLayout GridLayout用于核心布局的原因是它会为CENTER位置的组件提供所有剩余空间。这可能不是你想要的,但这就是我使用它的原因。

GridBagLayoutFlowLayout都会围绕容器的中心布置它的容器,GridBagLayout垂直和水平地执行它,FlowLayout只能水平地执行它(默认情况下)

Buttons

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.TitledBorder;

public class Q17_1 extends JFrame {

    JButton left = new JButton("<=");
    JButton right = new JButton("=>");
    JPanel p1 = new JPanel();
    JRadioButton rb1 = new JRadioButton("Red");
    JRadioButton rb2 = new JRadioButton("Yellow");
    JRadioButton rb3 = new JRadioButton("White");
    JRadioButton rb4 = new JRadioButton("Gray");
    JRadioButton rb5 = new JRadioButton("Green");
    JPanel p2 = new JPanel();
    JLabel m = new JLabel("Welcome to Java");
//  Message m = new Message("Welcome to Java");

    public Q17_1() {
        setLayout(new BorderLayout());

        p1.setBorder(new TitledBorder("Select Message Panel Background"));
        ButtonGroup group = new ButtonGroup();
        group.add(rb1);
        group.add(rb2);
        group.add(rb3);
        group.add(rb4);
        group.add(rb5);
        rb1.setMnemonic('R');
        rb2.setMnemonic('Y');
        rb3.setMnemonic('W');
        rb4.setMnemonic('G');
        rb5.setMnemonic('N');

        p1.setLayout(new GridLayout(1, 5, 5, 5));
        p1.add(rb1);
        p1.add(rb2);
        p1.add(rb3);
        p1.add(rb4);
        p1.add(rb5);

        p2.setLayout(new FlowLayout());
        add(p1, BorderLayout.NORTH);
        add(m);
        p2.add(left);
        p2.add(right);

        add(p2, BorderLayout.SOUTH);

        left.addActionListener((ActionEvent) -> {
//          m.moveLeft();
//          repaint();
        });

        right.addActionListener((ActionEvent) -> {
//          m.moveRight();
//          repaint();
        });

//      rb1.addActionListener(m);
//      rb2.addActionListener(m);
//      rb3.addActionListener(m);
//      rb4.addActionListener(m);
//      rb5.addActionListener(m);
    }

    public static void main(String[] args) {
        Q17_1 frame = new Q17_1();
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

}
  

但如果我想使用BoxLayout练习p2。为了使按钮居中,我应该为参数添加什么?

由于容器的尺寸动态,您可以使用一些水平胶水

    p2.add(Box.createHorizontalGlue());
    p2.add(left);
    p2.add(right);
    p2.add(Box.createHorizontalGlue());