删除组件后居中框布局

时间:2012-07-02 12:56:53

标签: java swing layout layout-manager boxlayout

我有一个创建JButton的程序,然后将其添加到带有BoxLayout的JPanel中,BoxLayout设置为垂直放置它们。偶尔会从JPanel中删除第一个按钮。最初,按钮正确居中,按钮也正在成功删除。问题是剩下的按钮然后移开以填充空间。这不是我想要的,相反,我希望它们沿着y轴重新居中而不会分开。

我有一个扩展JPanel的类。在构造函数中创建了BoxLayout。

setPreferredSize(new Dimension(150, 500));
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setAlignmentY(CENTER_ALIGNMENT);

创建按钮目前是此类中的一种方法:

createButtons(int numButtons){
for (int i=0;i<numButtons;i++) {
    add(new JButton());
}

删除是另一种方法:

removeButton(){
    if(getComponentCount()>1){
        remove(0);
        validate();
        repaint();
    }
}

是否有人知道如何使按钮沿y轴保持居中而不会分开以填充包含的面板?

3 个答案:

答案 0 :(得分:1)

您是否听说过BoxLayouts中的胶水使用隐形组件作为填充物(胶水),我认为应该有助于保持按钮居中,请参阅以下两个链接:BoxLayout docsBoxLayout - Filler这个网站上也有一些关于Boxlayout的精彩教程:BoxLayout Gluethis

答案 1 :(得分:1)

我不明白你的问题。也许我错过了一个步骤,但在下面的代码片段中,所有组件都是水平居中并在顶部对齐。每当移除组件时,下面的按钮会自动堆叠在顶部。也许从这个片段开始向我们展示您的问题:

import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestButtons {

    protected void createAndShowGUI() {
        JFrame frame = new JFrame("Test buttons/BoxLayout");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.RED));
        // panel.setPreferredSize(new Dimension(150, 500));
        BoxLayout mgr = new BoxLayout(panel, BoxLayout.Y_AXIS);
        panel.setLayout(mgr);
        for (int i = 0; i < 5; i++) {
            final JButton button = new JButton("Remove Hello World " + (i + 1));
            button.setAlignmentX(Component.CENTER_ALIGNMENT);
            button.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    panel.remove(button);
                    panel.revalidate();
                    panel.repaint();
                }
            });
            panel.add(button);
        }
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestButtons().createAndShowGUI();
            }
        });
    }

}

答案 2 :(得分:0)

我认为使用BOX Layout是一个问题。按钮确实保持居中,但“填充”到它们添加到的窗格边缘。我相信正确的方法(如果你知道你要创建的按钮的数量)是使用带有setPreferedSize方法的网格布局。

JButton btn = new JButton(String.valueOf(i));
btn.setPreferredSize(new Dimension(40, 40));
panel.add(btn);