如何在屏幕上添加两个组件而不重叠,只显示一个?

时间:2014-01-05 21:31:04

标签: java jframe jcomponent

现在我只能在屏幕上显示我的两个组件中的一个,第二个组件总是与第一组重叠,所以第二组仅显示。

如何让它们同时显示出来。

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。

3 个答案:

答案 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中向面板添加组件时,您应该为面板选择LayoutManagerFlowLayout很简单,GridBoxLayout灵活,但还有更多)。根据所选的布局,您还可以将数据与组件相关联,以告知LayoutManager放置组件的位置。

答案 2 :(得分:0)

您遇到的“主要”问题是,默认情况下JFrame使用BorderLayoutBorderLayout只会占用五个可用职位中的每一个。默认情况下,BorderLayout会将组件放置在CENTER位置。

您应该探索符合您要求的其他布局管理器。

查看Laying Out Components Within a Container