有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JLabel添加图片时遇到的java问题

我正在为我的高中计算机科学课做最后一个项目(一个非常平庸的口袋妖怪游戏),我有一个switch语句的问题,我添加了一个带有图像图标的Jlabel

当我运行驱动程序并打开此面板时,它应该添加一个随机对手,这就是switch语句的目的,它根据对手是谁给oppHP变量一个值。底部的PaintComponent设置背景图像。问题是当我运行它时,没有对手图片显示它只是背景图像

请记住,我对编码非常陌生,所以我可能不理解解释,换句话说,如果不太麻烦的话,尽量保持简单。谢谢

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Lucario extends JPanel {

    private int myHP;
    private int oppHP;
    private boolean ok;
    private int rand;
    private JButton olabel;
    private JButton mlabel;

    public Lucario() {
        ImageIcon lIcon = new ImageIcon("opplucario.png");
        ImageIcon sIcon = new ImageIcon("oppsylveon.png");
        ImageIcon cIcon = new ImageIcon("oppcharizard.png");
        ImageIcon grIcon = new ImageIcon("oppgreninja.png");
        ImageIcon geIcon = new ImageIcon("oppgengar.png");
        ImageIcon mIcon = new ImageIcon("oppmystery.png");
        for (int k = 0; k < 1; k++) {
            rand = (int) (Math.random() * 6);

        }
        switch (rand) {

            case 0:

                JLabel l = new JLabel();
                l.setIcon(lIcon);
                add(l);

                oppHP = 344;
                break;
            case 1:

                JLabel s = new JLabel();
                s.setIcon(sIcon);
                add(s);
                oppHP = 394;
                break;
            case 2:

                JLabel c = new JLabel();
                c.setIcon(cIcon);
                add(c);
                oppHP = 360;
                break;
            case 3:

                JLabel gr = new JLabel();
                gr.setIcon(grIcon);
                add(gr);
                oppHP = 348;

                break;
            case 4:

                JLabel ge = new JLabel();
                ge.setIcon(geIcon);
                add(ge);
                oppHP = 324;
                break;
            case 5:

                JLabel m = new JLabel();
                m.setIcon(mIcon);
                add(m);
                oppHP = 400;
                break;
        }

        myHP = 344;
        this.setLayout(null);
        olabel = new JButton("HP: " + oppHP);
        olabel.setFont(new Font("Serif", Font.BOLD, 20));
        olabel.setBounds(70, 100, 150, 40);
        olabel.setOpaque(false);
        olabel.setContentAreaFilled(false);
        olabel.setBorderPainted(false);
        add(olabel);
        mlabel = new JButton("HP: " + myHP);
        mlabel.setFont(new Font("Serif", Font.BOLD, 20));
        mlabel.setBounds(350, 330, 150, 40);
        mlabel.setOpaque(false);
        mlabel.setContentAreaFilled(false);
        mlabel.setBorderPainted(false);
        add(mlabel);

    }

    public void paintComponent(Graphics g) {

        ImageIcon Backg = new ImageIcon("playbg.png");
        g.drawImage(Backg.getImage(), 0, 0, 590, 590, this);

    }

}

共 (2) 个答案

  1. # 1 楼答案

    主要问题是使用null布局,例如

    JLabel m = new JLabel();
    m.setIcon(mIcon);
    add(m);
    

    m默认情况下没有大小或位置信息(0x0@0x0

    适当的答案是使用一个或多个适当的布局管理器

  2. # 2 楼答案

    public void paintComponent(Graphics g) {
        ImageIcon Backg = new ImageIcon("playbg.png");
    

    应该是:

    public void paintComponent(Graphics g) { 
        super.paintComponent(g); 
    
    1. 重写的绘制中的第一个调用应该是super方法
    2. 映像应作为类成员加载和缓存。千万不要尝试在绘制方法中加载资源,这应该很快完成

    一般提示

    1. 到部署时,这些资源很可能会变成一个。在这种情况下,资源必须由URL而不是File访问。请参见标签的info page,了解形成URL的方法
    2. Java GUI可能必须在多种平台上工作,在不同的屏幕分辨率上&;使用不同的plaf。因此,它们不利于部件的精确放置。要为健壮的GUI组织组件,请使用布局管理器或combinations of them1,以及布局填充&;white space2的边框。