首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >背景与我的另一个JLabels的视觉重叠

背景与我的另一个JLabels的视觉重叠
EN

Stack Overflow用户
提问于 2019-06-18 23:59:27
回答 1查看 134关注 0票数 0

我正在用JFrame和JLabels创建一个非常简单的游戏,我设法让它工作,但在放置背景的时候,我发现了一个问题。我设置为背景的图像覆盖了我的另一个JLabels (它们仍然可以在后面工作,但你看不到它们)。

代码语言:javascript
复制
public class Game extends JPanel {
    
    Player p1 = new Player(this, 'a');
    Player p2 = new Player(this, 'r');
    
    public Game() {}
    
    public void move() {}
    public void gameOver() {}
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        p1.paint(g2d);
        p2.paint(g2d);
    }
    
    public static void main(String[] args) throws InterruptedException, IOException {

        BufferedImage img = ImageIO.read(new File(not relevant));
        JFrame frame = new JFrame("Window");
        JLabel background = new JLabel(new ImageIcon(img));
        Game game = new Game();
        
        
        frame.add(game);
        frame.add(background);
        
        
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        while (true) {
            game.move();
            game.repaint();
            Thread.sleep(10);
        }
    }

}

我认为问题来自于使用我的类游戏(这是一个“运行”游戏的类)作为JPanel,然后主要创建一个JFrame并添加它的…如果没有办法解决这个问题,我会改变它,但我想保持它现在的样子。我已经尝试交换了:

Frame.add(游戏);frame.add(背景);

但结果是:

游戏-->背景-->您只能看到背景,但仍然可以玩游戏

背景-->游戏-->你只能看到一个小窗口(没有大小,只有最小化,最大化和关闭),但仍然可以玩游戏。

我也尝试在Game类中创建背景图像,但它不起作用。

EN

回答 1

Stack Overflow用户

发布于 2019-06-19 03:32:58

默认情况下,add(game)的内容窗格使用BorderLayout,这意味着JFrame将把游戏组件放在BorderLayout的中心。一个BorderLayout一次只能有一个中心组件,因此add(background)用背景JLabel替换了旧的中心组件(游戏)。

一个简单的解决方案是避免使用JLabel作为背景,只在paint方法中绘制背景:

代码语言:javascript
复制
g2d.drawImage(img, 0, 0, this);
p1.paint(g2d);
p2.paint(g2d);

这将需要在游戏类中有一个类型为BufferedImage (或仅为图像)的私有字段,您可以在该类的构造函数中设置该字段。

请注意,您应该几乎总是覆盖paintComponent,而不是绘制:

代码语言:javascript
复制
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    // ...
}

有关绘制Swing组件的所有详细信息,请参阅https://www.oracle.com/technetwork/java/painting-140037.html

JFrame:在调用pack()方法时,您的background JLabel似乎正在定义JFrame内容的大小。

一旦删除了后台JLabel,剩下的唯一组件( Game类的实例)必须定义自己的首选大小,以便在调用JFrame的pack()方法时,它将知道JFrame内容的大小。您可以通过让Game类显式报告其首选大小来完成此操作:

代码语言:javascript
复制
@Override
public Dimension getPreferredSize() {
    return new Dimension(img.getWidth(), img.getHeight());
}

这将要求img的类型为BufferedImage,因为在Image类中不存在零参数getWidth和getHeight方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56653002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档