GridBagLayout 和 JFrame 内容窗格
GridBagLayout and JFrame Content Pane
我目前正在尝试正确对齐框架内的一些组件。我正在为此使用 GridBagLayout,但看起来这条线造成了麻烦:
frame.setContentPane(new ImagePanel(myImage));
我想将按钮居中放置在中间,但它没有 work.If 我评论它,一切正常。还尝试使用 BorderLayout 和 CENTER 创建另一个面板,但结果相同。我想要我的 JFrame 的背景图像。我应该怎么办 ?还是我做错了什么?
private Image image;
public MainClass(Image image){
this.image = image;
GridBagConstraints c = new GridBagConstraints();
this.setOpaque(false);
this.setLayout(new GridBagLayout());
c.gridx = 0;
c.gridy = 0;
this.add(new JButton("1"), c);
c.gridx = 0;
c.gridy = 1;
this.add(new JButton("2"), c);
c.gridx = 0;
c.gridy = 2;
this.add(new JButton("3", c);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
public static void main(String[] args) throws IOException {
BufferedImage myImage = ImageIO.read(new File("images/city.png"));
JFrame frame = new JFrame();
frame.setContentPane(new MainClass(myImage));
frame.setSize(600, 375);
frame.setUndecorated(true);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//edit : 我刚刚意识到我正在尝试将面板添加到我的框架中.. 乍一看效果很好。
最直接和残酷的答案是 - 不要使用 Java Swings 的布局管理器,它们在大多数情况下几乎无法使用。尝试一些第三方
我强烈推荐 http://www.miglayout.com/ 的 MIG Layout,它非常强大、灵活、易于使用,并带有不错的文档和示例。
frame.setContentPane(new ImagePanel(myImage));
frame.add(new MainClass());
首先将 ImagePanel 设置为内容窗格,这样就可以了。然后将 MainClass() 添加到可能没问题的框架中。这意味着 MainClass 将被添加到 ImagePanel。
If i comment it,everything works good.
默认情况下,JPanel 使用 FlowLayout
,因此 MainClass 将在面板顶部居中。
您需要将 ImagePanel 的布局设置为 BorderLayout
。然后它应该像直接将 MainClass 添加到框架中一样工作。
JLabel 背景 = new JLabel(new ImageIcon(ImageIO.read(...)));
setContentPane(背景)
...
添加所有其他按钮
我目前正在尝试正确对齐框架内的一些组件。我正在为此使用 GridBagLayout,但看起来这条线造成了麻烦:
frame.setContentPane(new ImagePanel(myImage));
我想将按钮居中放置在中间,但它没有 work.If 我评论它,一切正常。还尝试使用 BorderLayout 和 CENTER 创建另一个面板,但结果相同。我想要我的 JFrame 的背景图像。我应该怎么办 ?还是我做错了什么?
private Image image;
public MainClass(Image image){
this.image = image;
GridBagConstraints c = new GridBagConstraints();
this.setOpaque(false);
this.setLayout(new GridBagLayout());
c.gridx = 0;
c.gridy = 0;
this.add(new JButton("1"), c);
c.gridx = 0;
c.gridy = 1;
this.add(new JButton("2"), c);
c.gridx = 0;
c.gridy = 2;
this.add(new JButton("3", c);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
public static void main(String[] args) throws IOException {
BufferedImage myImage = ImageIO.read(new File("images/city.png"));
JFrame frame = new JFrame();
frame.setContentPane(new MainClass(myImage));
frame.setSize(600, 375);
frame.setUndecorated(true);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//edit : 我刚刚意识到我正在尝试将面板添加到我的框架中.. 乍一看效果很好。
最直接和残酷的答案是 - 不要使用 Java Swings 的布局管理器,它们在大多数情况下几乎无法使用。尝试一些第三方
我强烈推荐 http://www.miglayout.com/ 的 MIG Layout,它非常强大、灵活、易于使用,并带有不错的文档和示例。
frame.setContentPane(new ImagePanel(myImage));
frame.add(new MainClass());
首先将 ImagePanel 设置为内容窗格,这样就可以了。然后将 MainClass() 添加到可能没问题的框架中。这意味着 MainClass 将被添加到 ImagePanel。
If i comment it,everything works good.
默认情况下,JPanel 使用 FlowLayout
,因此 MainClass 将在面板顶部居中。
您需要将 ImagePanel 的布局设置为 BorderLayout
。然后它应该像直接将 MainClass 添加到框架中一样工作。
JLabel 背景 = new JLabel(new ImageIcon(ImageIO.read(...))); setContentPane(背景)
...
添加所有其他按钮