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
sGridBagLayout
约束,应该在调用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