图像未显示在JLabel上

时间:2014-06-14 10:02:59

标签: java swing paint jlabel

我的任务是制作Candy Crush Saga的java复制品。 现在我非常坚持GUI部分。 我已经决定每个糖果将由一个拿着糖果图标的JLabel和一个控制功能的mouselistener来代表。 发生的事情是,在我完成屏幕显示后,鼠标监听器会响应,但图像没有显示,这意味着我可以按标签获得响应,但无法看到图标。我拿这个,因为标签在面板上,但不知何故不可见或图标未正确加载 - 虽然在检查ImageIcon.toString时它显示文件的路径。 有什么想法吗?

以下是代码:

public class Board extends JPanel {
Candy[][] board;
static final int TILE_SIZE = 55;
static final int  TILES_MARGIN = 8;


public Board() {
    setFocusable(true);

    board = new Candy[13][13];
    Candy c;
    for (int i = 0; i < 13; i++)
        for (int j = 0; j < 13; j++) {
            if (i != 0 && i != 1 && j != 0 && j != 1 && i != 11 && i != 12 && j != 11 && j != 12) {
                Random rand = new Random();
                int randomNum = rand.nextInt((6 - 1) + 1) + 1;
                c = new Basic(randomNum, this);
            } else {
                c = new Basic(0, this);
            }
            setAt(i, j, c);
        }
    repaint();
}

public void drawCandy(Graphics g2, Candy candy, int x, int y) {
    Graphics2D g = ((Graphics2D) g2);
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
    int value = candy.getClr();
    int xOffset = offsetCoors(x);
    int yOffset = offsetCoors(y);
    ImageIcon myImg = candy.switchIcon();
    JLabel toAdd = new JLabel(myImg);
    toAdd.setIcon(myImg);
    toAdd.setLocation(xOffset,yOffset);
    toAdd.setSize(TILE_SIZE,TILE_SIZE);
    toAdd.addMouseListener(new ButtonPressed(x,y,candy));
    toAdd.setVisible(true);
    if (value != 0)
        add(toAdd);
}
private static int offsetCoors(int arg) {
    return (arg-2) * (TILES_MARGIN + TILE_SIZE) + TILES_MARGIN;
}

public void paint(Graphics g) {
    super.paint(g);
    removeAll();
    requestFocusInWindow();
    g.setColor(Color.black);
    g.fillRect(0, 0, this.getSize().width, this.getSize().height);

    for (int x = 2; x < 11; x++) {
        for (int y = 2; y < 11; y++) {
            drawCandy(g, board[x][y], x, y);
        }
    }

    validate();
}

和JFrame:

public Game() {
    super("Candy Crush Game");
    setDefaultLookAndFeelDecorated(true);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    getContentPane().setLayout(new BorderLayout());
    setSize(600, 600);
    setResizable(false);
    setLocationRelativeTo(null);
    this.board = new Board();


    this.score = 0;
    this.moves = 20;

    this.getContentPane().add(board, BorderLayout.CENTER);
    setVisible(true);


     board.checkSquare(2, 2, 10, 10);


}

我非常沮丧,任何帮助都会很棒!

1 个答案:

答案 0 :(得分:3)

而不是覆盖paint()方法使用paintComponent()的{​​{1}}方法。

JPanel

了解更多


阅读图片图标可能存在一些问题。我的另一篇文章可能对你有帮助。

而不是创建新的@Overrie public void paintComponent(Graphics g) { super.paintComponent(g); //your custom painting here } ,只需更改它的图标。