Java 如何定制JPanel在JPanel中的位置
该类扩展了JPanelJava 如何定制JPanel在JPanel中的位置,java,swing,layout,jpanel,Java,Swing,Layout,Jpanel,该类扩展了JPanel public void createDisplay(){ frame = new JFrame(); frame.setTitle(title); frame.setSize(new Dimension(width, height)); frame.setVisible(true); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFra
public void createDisplay(){
frame = new JFrame();
frame.setTitle(title);
frame.setSize(new Dimension(width, height));
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setPreferredSize(new Dimension(width, height));
this.setMaximumSize(new Dimension(width, height));
this.setMinimumSize(new Dimension(width, height));
this.setLayout(null); //have tried default and BorderLayout
this.setSize(new Dimension(width, height));
this.setBounds(0, 0, width, height);
//basically trying everything
frame.add(this);
frame.pack();
}
在启动时,这段代码运行良好,JPanel完全覆盖了父帧的大小
但是,我的程序稍后尝试向类的extend JPanel添加一个新的JPanel,方法是:
public void gameOverWindow(){ ;
JPanel panel = new JPanel(new BorderLayout());
panel.setPreferredSize(new Dimension(200, 100));
JLabel label = new JLabel("Game Over");
label.setPreferredSize(new Dimension(40, 15));
//trying setPosition also doesn't work with BorderLayout or FlowLayout
JButton button_01 = new JButton("new");
button_01.setPreferredSize(new Dimension(100, 10));
JButton button_02 = new JButton("exit");
button_02.setPreferredSize(new Dimension(100, 10));
panel.add(label, BorderLayout.NORTH);
panel.add(button_01, BorderLayout.WEST);
panel.add(button_02, BorderLayout.EAST);
this.add(panel);
this.revalidate();
}
这个新的JPanel以正确的BorderLayout格式显示内容,但是JPanel本身将保持在扩展JPanel的顶部中心,我知道这是因为默认布局设置为FlowLayout,但是将其设置为BorderLayout只会导致面板占据整个屏幕。将布局设置为null会完全打断框架,除了框架的最小化和关闭按钮外,不会显示任何内容。试图设置此JPanel的位置或边界也不能用于任何布局。我在网上读了很多关于这一点的帖子,但它们似乎都有所不同,令人困惑,我如何控制我的新JPanel的位置?通常我建议使用a在不同的视图之间切换,但从可用的信息中很难确定这是否有帮助 相反,您可以使用复合布局。即使用不同的布局将一个容器包装到另一个容器中 在本例中,我只使用了
BorderLayout
和gridbagloayout
删除不同面板的组件而不是直接将其添加到GridBagLayout的目的是什么
因为它们会干扰其他组件的布局
然后我想要一个小的Jpanel在里面弹出并且不引人注目
您可以使用框架的glassPane
或使用overlylayout
例如:
这些信息中的大部分都应该出现在您最初的问题中,这样可以减少彼此的时间浪费*但是JPanel本身将保持在扩展JPanel的顶部中心“*-这就是
面板的作用。add(label,BorderLayout.NORTH);
将如何控制我的新JPanel的位置?“-使用适当的布局。避免使用setXxxSize
,setSize
,setBounds
,setLocation
如果不使用单一布局管理器,可以使用多个容器,将它们与不同的布局组合在一起managers@MadProgrammer该面板的标签和按钮布局良好,这是我想要移动的JPanel面板的实际位置,尝试一下。add(panel,BorderLayout.center)也不会改变它,因此,您正在将面板添加到面板中,对吗?@正确,并且该面板被添加到JFrame中,因此我的扩展JPanel包含通过游戏循环更新的图形内容,然后我想要一个小的Jpanel在里面弹出并且不引人注目,是否可以使用GridBagLayout创建一个可以定位的小面板?移除不同面板的组件而不是直接添加到GridBagLayout的目的是什么?“移除不同面板的组件而不是直接添加到GridBagLayout的目的是什么?”因为它们会干扰其他组件的布局。“然后我想要一个小的Jpanel弹出并保持低调”-利用框架的JLayerdPane
或使用overlylayout
-这些信息中的大部分应该在您最初的问题中
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
JButton gameOver = new JButton("Game over man");
gameOver.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JLabel("Game Over Man", JLabel.CENTER), BorderLayout.NORTH);
panel.add(new JButton("New"), BorderLayout.WEST);
panel.add(new JButton("Exit"), BorderLayout.EAST);
removeAll();
JPanel inner = new JPanel(new GridBagLayout());
inner.add(panel);
add(inner);
revalidate();
repaint();
}
});
JPanel inner = new JPanel(new GridBagLayout());
inner.add(gameOver);
add(inner);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}