Java - JFrame不显示多个图片

时间:2015-09-11 00:04:37

标签: java image swing jframe jlabel

所以我一直在尝试自学Java(2D)游戏的基础知识。经过一个漫长而烦人的过程试图让图像显示出来后,我开始工作了。不幸的是,当我尝试添加第二张图片时,它取代了第一张图片。我知道我犯了一些明显的,noob错误,但是,嘿,我在这是一个菜鸟。无论如何,这是我的代码:

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {

    public static void main(String[] args0) {

        JFrame frame = new JFrame();
        ImageIcon background = new ImageIcon("background.png");
        JLabel backgroundLabel = new JLabel(background);
        frame.add(backgroundLabel);
        backgroundLabel.setVisible(true);

        ImageIcon title = new ImageIcon("title.png");
        JLabel titleLabel = new JLabel(title);
        frame.add(titleLabel);
        titleLabel.setVisible(false);

        frame.setVisible(true);
        frame.setTitle("Fastball");
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();

    }

}

当我运行它时,新添加的" title.png"部分覆盖第一个图像,替换它。请告诉我最简单的方法,通过简要解释我的错误来解决这个问题。

(P.S。我使用Eclipse Mars和最新的Java东西。)

1 个答案:

答案 0 :(得分:3)

首先查看How to Use BorderLayout以了解问题发生的原因,然后查看Laying Out Components Within a Container了解可能的解决方案

linkTExt

您应该将JFrame frame = new JFrame(); //... frame.setContentPane(backgroundLabel); frame.setLayout(new GridBagLayout()); ImageIcon title = new ImageIcon("title.png"); JLabel titleLabel = new JLabel(title); frame.add(titleLabel); //... 添加到titleLabel,但是您可以使用backgroundLabel“欺骗”一点,您可以将JFrame设置为“内容窗格” “对于框架,这意味着您添加到框架中的任何内容实际上都会添加到backgroundLabel

Cavets

  • backgroundLabel默认情况下没有应用布局管理,这意味着除非您应用一个布局管理,否则您添加到其中的任何内容都不会被调整大小或定位,并且会显示为“隐藏”
  • JLabel不使用布局管理器来计算它的首选大小,而是依赖于图像的大小及其文本。在大多数情况下,这可能不是问题,但如果您的内容由于某种原因超出图像的大小(水平或垂直),内容将被剪裁。您可以查看this example,其中显示了几种不同的方法来实现相同的结果