为什么我的 JLabel 没有生成图像?

why is my JLabel not producing an image?

我已经阅读了几个教程并且想知道为什么我的 JLabel 没有生成图像?我以为我已经拥有了显示图像所需的一切。我程序中的其他图形是否可能会干扰?如果有多个图像彼此重叠,是否有任何自上而下的图层系统 java 用于确定哪些图像彼此重叠?

package scratch;

import java.awt.Font;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;
import java.awt.Rectangle;

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

//import statements
//Check if window closes automatically. Otherwise add suitable code
public class okay extends JFrame {

    JPanel jp = new JPanel();
    JLabel jl = new JLabel();

    public okay(){

        jl.setIcon(new ImageIcon("C:\Users\ShawnK\Desktop\cat.png"));
        jp.add(jl);
        add(jp);
        validate();
    }

    public static void main(String args[]) {

        JFrame window = new JFrame();

        okay t1 = new okay();

        window.setSize(640,800);
        window.setTitle("lets do this");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
        window.setVisible(true);


        drawingComponent DC = new drawingComponent();


        ai enemy = new ai();
        window.add(DC);
        window.add(t1);

    }

 }

您只是在创建一个普通的 JFrame:

JFrame window = new JFrame();

而且您永远不会创建 new okay() 对象。了解它不会通过魔法创建自己,如果你想显示它,你必须在代码中执行此操作。

顺便说一句,我不知道 drawingComponent 是什么:

drawingComponent DC = new drawingComponent();

因为您从不显示 class 代码。此外,在添加 所有 组件之前,您不应该将 JFrame 设置为可见。


还有

  • 学习并遵循 Java 命名约定,因为这样做会帮助其他人(我们!!)更好地理解您的代码。变量名称应全部以小写字母开头,而 class 名称应以大写字母开头。
  • 避免扩展 JFrame。虽然这对于像这样的小程序来说可能没问题,但它不能很好地扩展,这意味着它会使您的代码更加复杂,并使您在更大或更复杂的程序中陷入困境。
  • 而是将您的 GUI 用于创建 JPanel,如果需要可以将面板放置在 JFrames 中,或者 JDialogs、JOptionPanes 或其他 JPanel。这将为您的代码提供更大的灵活性。
  • 同样,在添加所有初始组件之前,不要对 JFrame 调用 setVisible(true)
  • 是的,您最好使用 ImageIO.read(...) 将图像作为 BufferedImage 获取,然后将其放入您的 ImageIcon 中。它更安全一些(我 认为 )允许更好地缓存图像。