【问题标题】:Java - JFrame not showing more than one pictureJava - JFrame 不显示多于一张图片
【发布时间】:2015-12-07 10:11:14
【问题描述】:

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

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”部分会覆盖第一个图像,替换它。请告诉我解决此问题的最简单方法,并简要解释我的错误。

(附注:我使用的是 Eclipse Mars 和所有 Java 的最新版本。)

【问题讨论】:

  • 这种方法试图在应该将(除一个之外的所有)组件扔出窗口并进行自定义绘制的情况下布局组件!详见教程Performing Custom Painting课程。
  • 顺便说一句 - backgroundLabel.setVisible(true); .. titleLabel.setVisible(false); 建议您实际上可以尝试实现 CardLayout 的用途。它可以根据需要在“视图”之间切换。
  • 为什么有人反对我?我知道这可能很简单,但提问是这个网站的目的! ;(

标签: java image swing jframe jlabel


【解决方案1】:

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

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 设置为框架的“内容窗格”,这意味着您添加到框架中的任何内容实际上都会添加到backgroundLabel

告诫

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

【讨论】:

  • 我照你说的做了,而且奏效了,但我又犯了一个错误;如何设置 GridBagLayout 中元素的位置?
  • GridBagLayout 是一个复杂的野兽(强大但复杂),看看How to Use GridBagLayout 开始
  • 我检查了那篇文章,但我仍然遇到问题。有没有办法使用 GridBagLayout 将某些东西放在精确的坐标上?
  • gridxgridy 以及您定义的约束,以指定组件在虚拟网格中的位置。像素完美布局是现代 ui 设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
  • 好的,我明白了。感谢您的帮助,希望我可以使用所有这些信息来制作正确的布局(这很愚蠢)。无论如何,谢谢,稍后再见。
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多