我有问题。现在我正在使用3个面板,mainPanel和另外2个面板(btnPanel和iconPanel)。 所以问题是当我按下“重置”按钮时,我删除了iconPanel并再次添加它,它自己稍微向右移动。也许有人可以检查我的代码问题在哪里?
此外,我不想创建另一个问题,所以我再提出2个问题。
我是否正确删除了JPanel? 如果我删除里面有组件的JPanel,它们也将从内存中删除?
P.S。我初学者所以不要判断我:)。
Main.java
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Main extends JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Made by Mac4s");
frame.setVisible(true);
frame.setSize(310, 654);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setResizable(false);
MainScreen screenObj = new MainScreen();
screenObj.setPreferredSize(new Dimension(310, 650));
frame.add(screenObj);
}
});
}
}
MainScreen.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class MainScreen extends JPanel {
private JButton resetBtn;
private JPanel btnPanel;
private JPanel iconPanel;
public MainScreen() {
JPanel mainPanel = new JPanel(new BorderLayout());
this.setBackground(Color.BLACK);
setBtnPanelAndComp();
setIconPanelAndComp();
add(mainPanel);
}
private void setBtnPanelAndComp() {
btnPanel = new JPanel(new BorderLayout());
btnPanel.setBackground(Color.GREEN);
btnPanel.setPreferredSize(new Dimension(295, 30));
setButtons();
this.add(btnPanel, BorderLayout.NORTH);
}
private void setButtons() {
resetBtn = new JButton("Reset");
resetBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
resetIconLabel();
}
});
btnPanel.add(resetBtn, BorderLayout.WEST);
}
private void resetIconLabel() {
this.remove(iconPanel);
this.repaint();
this.revalidate();
setIconPanelAndComp();
}
private void setIconPanelAndComp() {
iconPanel = new JPanel(new BorderLayout());
iconPanel.setBackground(Color.YELLOW);
iconPanel.setPreferredSize(new Dimension(295, 580));
this.add(iconPanel, BorderLayout.SOUTH);
}
}
答案 0 :(得分:3)
"问题出在我按下按钮"重置"我删除了iconPanel并再次添加它,它自己稍微向右移动。"
发生这种情况的原因是JPanel
默认情况下有FlowLayout
。您正在尝试添加一个不存在的BorderLayout
职位。
this.add(iconPanel, BorderLayout.SOUTH);
FlowLayout
边缘有默认间隙,因此当您设置框架的大小时,这些间隙不会受到尊重。为了解决这个问题,最好是pack()
框架,而不是setSize()
BorderLayout
有效(不移动)的原因是因为不考虑首选尺寸。
如果您将构造函数中的布局设置为this.setLayout(new BorderLayout());
,您将无法获得转变。
public MainScreen() {
JPanel mainPanel = new JPanel(new BorderLayout());
this.setLayout(new BorderLayout()); <----
setBtnPanelAndComp();
setIconPanelAndComp();
add(mainPanel);
}
备注强>
setVisible()
。这就是为什么你的框架在你第一次打开时会跳起来的原因。您正在设置框架可见,然后使用该位置移动它,并添加组件。