现在我只能在屏幕上显示我的两个组件中的一个,第二个组件总是与第一组重叠,所以第二组仅显示。
如何让它们同时显示出来。
package Game;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Amazing {
private final int width = 300;
private final int height = width / 16 * 9;
private int scale = 3;
private static Graphics g;
private static JFrame frame = new JFrame();
public Amazing(){
Dimension size = new Dimension(width*scale, height*scale);
frame.setPreferredSize(size);
frame.setResizable(false);
frame.setTitle("Amazing!");
Character character = new Character(50,50,scale,width,height);
Map map = new Map(scale, width, height);
frame.add(map);
frame.add(character);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
character.requestFocus();
}
public static void main(String[] args){
Amazing amazing = new Amazing();
}
}
我认为你不需要看其他两个类(如果你想我也可以发布它们)但我认为你需要知道的是地图类用paintComponent(Graphics g)
创建和绘制2个随机生成的矩形,而Character类创建并使用paintComponent(Graphics g)
方法在屏幕上显示和Image。
答案 0 :(得分:1)
由于您没有指定布局,因此您使用的是BorderLayout,每个部分只显示1个组件。除非在使用默认BorderLayout时将其他位置指定为附加arg,否则add(component)方法将“覆盖”之前的任何内容。因此,当您将第二个组件添加到框架时,它会覆盖第一个组件。
我注意到您导入了GridLayout,但我没有看到它在您的代码中使用过。如果在构造函数中添加语句,如:
this.setLayout(new GridLayout(4,2));
它会将布局从默认的BorderLayout更改为GridLayout,并且您将有4行,每行2个隔离区,用于放置组件。调用add(component)方法将在下一个可用部分中添加一个组件,从第1行第1行开始。
如果您只想添加这两项,请尝试添加语句
this.setLayout(new GridLayout(1,2));
添加组件之前。这将把它们并排放置。
答案 1 :(得分:0)
在Swing中向面板添加组件时,您应该为面板选择LayoutManager
(FlowLayout
很简单,GridBoxLayout
灵活,但还有更多)。根据所选的布局,您还可以将数据与组件相关联,以告知LayoutManager
放置组件的位置。
答案 2 :(得分:0)
您遇到的“主要”问题是,默认情况下JFrame
使用BorderLayout
。 BorderLayout
只会占用五个可用职位中的每一个。默认情况下,BorderLayout
会将组件放置在CENTER
位置。
您应该探索符合您要求的其他布局管理器。