我有一个创建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轴保持居中而不会分开以填充包含的面板?
答案 0 :(得分:1)
您是否听说过BoxLayouts中的胶水使用隐形组件作为填充物(胶水),我认为应该有助于保持按钮居中,请参阅以下两个链接:BoxLayout docs和BoxLayout - Filler这个网站上也有一些关于Boxlayout的精彩教程:BoxLayout Glue和this
答案 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);