Java 布局方法在第一次执行后中断

Java 布局方法在第一次执行后中断,java,swing,layout-manager,gridbaglayout,Java,Swing,Layout Manager,Gridbaglayout,当addComponents()方法运行一次时,我得到了我的JPanel所需的布局。但是,当addComponents()中的代码被多次执行时,JPanel的布局是完全错误的。有什么我似乎做错了的吗 public class DeleteStudent extends JPanel { public SearchPanel search = new SearchPanel(); private final JButton deleteButton = new J

addComponents()
方法运行一次时,我得到了我的JPanel所需的布局。但是,当
addComponents()
中的代码被多次执行时,JPanel的布局是完全错误的。有什么我似乎做错了的吗

public class DeleteStudent extends JPanel {

        public SearchPanel search = new SearchPanel();
        private final JButton deleteButton = new JButton("Delete from database");
        private GridBagConstraints cons = new GridBagConstraints();
        private final GridBagLayout gridBag = new GridBagLayout();

        public DeleteStudent() {
        super();
        setLayout(gridBag);
        setPreferredSize(new Dimension(400, 300));

        addComponents();
        addComponents(); //Method fails when run more than once!
        }

        public void addComponents() {
        cons.gridy = 1;
        cons.insets = new Insets(50, 0, 0, 0);
        gridBag.setConstraints(deleteButton, cons);

        removeAll();
        add(search);
        add(deleteButton);
        update();
        }

        private void update() {
        revalidate();
        repaint();
        }
屏幕截图

方法调用1后的JPanel:

JPanel在2次方法调用之后:

添加到我的注释中:

问题似乎是您在调用
removeAll()
之前设置了
JPanel
s
GridBagLayout
约束,应该在调用
removeAll()之后进行这样,当我们添加新组件时,
LayoutManager
仍然有效,并且没有重置为其默认值

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        createAndShowGui();
    }

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

    private void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new DeleteStudent());
        frame.pack();
        frame.setVisible(true);
    }
}

class DeleteStudent extends JPanel {

    public JPanel search = new JPanel() {//for testing
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    };
    private final JButton deleteButton = new JButton("Delete from database");
    private GridBagConstraints cons = new GridBagConstraints();
    private final GridBagLayout gridBag = new GridBagLayout();

    public DeleteStudent() {
        super();
        setLayout(gridBag);

        addComponents();
        addComponents(); //Method fails when run more than once!
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 300);
    }

    public void addComponents() {
        removeAll();//must call this before resetting Layout and adding new components

        cons.gridy = 1;
        cons.insets = new Insets(50, 0, 0, 0);
        gridBag.setConstraints(deleteButton, cons);

        add(search);
        add(deleteButton);
        update();
    }

    private void update() {
        revalidate();
        repaint();
    }
}

你完全错了是什么意思?发布一些截图。请发布一个最重要的可编译和可运行的复制和粘贴。也不要调用
setPreferredSize
,而是覆盖JPanel的
getPreferredSize