使用JLabel添加图片时出现问题

时间:2014-05-27 23:43:40

标签: java swing jlabel paintcomponent imageicon

我正在为我的高中计算机科学课(一个真正平庸的口袋妖怪游戏)做最后的项目,我在使用switch语句时遇到了麻烦,我在其中添加了带有ImageIcon的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 个答案:

答案 0 :(得分:2)

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

JLabel m = new JLabel();
m.setIcon(mIcon);
add(m);
默认情况下,

m没有尺寸或位置信息(0x0 @ 0x0

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

答案 1 :(得分:1)

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

应该是:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
  1. 重写绘画中的第一个调用应该是超级方法。
  2. 应该加载图像并将其作为类成员进行缓存。永远不要尝试在paint方法中加载资源,该方法应该快速完成。
  3. 一般提示

    1. 到部署时,这些资源可能会成为。在这种情况下,必须由URL而不是File访问资源。有关标记的info page,请参阅URL
    2. Java GUI可能必须在许多平台上工作,在不同的屏幕分辨率和使用不同的PLAF。因此,它们不利于组件的精确放置。要组织强大的GUI组件,而是使用布局管理器,或combinations of them 1 ,以及布局填充和&amp; white space 2 的边框。