ImageIcon未显示

时间:2012-03-08 14:22:03

标签: java swing imageicon

我正在尝试显示类主教的对象的ImageIcon。使用getImage()检索ImageIcon。返回的ImageIcon存储在引用m中但它没有显示,并且正在显示另一个直接加载的ImageIcon h。我犯了什么错误?

import javax.swing.*;

//Game.java

public class Game {

    public static void main(String[] args) {
        board b = new board();
        bishop bis1 = new bishop();
        bis1.setLocation(0, 0);
        ImageIcon m = bis1.getImage();
        b.squares[0][1].add(new JLabel(m));
        ImageIcon h = new ImageIcon("rook.png");
        b.squares[0][0].add(new JLabel(h));
    }
}

//bishop.java
import javax.swing.*;
import java.awt.*;

public class bishop {
    private ImageIcon img;
    private int row;
    private int col;

    public void bishop() {
        img = new ImageIcon("bishop.png");
    }

    public void setLocation(int i, int j) {
        row = i;
        col = j;
    }

    public int getX() {
        return row;
    }

    public int getY() {
        return col;
    }

    public ImageIcon getImage() {
        return img;
    }
}

// board.java
import javax.swing.*;
import java.awt.*;

public class board {
public JFrame frame;
public JPanel squares[][] = new JPanel[3][3];

public board() {
frame = new JFrame("Simplified Chess");
frame.setSize(900, 400);
frame.setLayout(new GridLayout(2,3));

for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        squares[i][j] = new JPanel();

        if ((i + j) % 2 == 0) {
            squares[i][j].setBackground(Color.black);
        } else {
            squares[i][j].setBackground(Color.white);
        }   
        frame.add(squares[i][j]);
     }
   }

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
  }

}

4 个答案:

答案 0 :(得分:5)

您使用不必要的void错误地定义了构造函数。因此,Bishop类调用默认的空构造函数,因此永远不会正确设置变量img。删除它,以便正确调用构造函数:

而不是:

public void bishop() {
        img = new ImageIcon("bishop.png");
    }

无空虚地定义:

public bishop() {
            img = new ImageIcon("bishop.png");
        }

答案 1 :(得分:1)

我没有足够的代码让我准确说出来。我需要看一下董事会类(顺便说一下:类名应该用Java大写:Board.java)

但我猜这是与董事会班级董事会布局的方式有关。

你能加载并只展示主教吗?这将决定问题是在寻找和装载主教。以下代码将执行此操作,这将有助于消除可能的原因:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.getContentPane().add(new JLabel(new ImageIcon("bishop.png")));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

答案 2 :(得分:1)

董事会究竟是什么?我假设它可能会扩展一个Swing组件,如JFrame?

所有与GUI相关的事件都应该在Event Dispatcher Thread(EDT)上进行。该线程负责更新GUI。如果您需要从其他类更新GUI,则需要使用SwingUtilities.invokeLater()

public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                board b = new board();
                bishop bis1 = new bishop();
                bis1.setLocation(0, 0);
                ImageIcon m = bis1.getImage();
                b.squares[0][1].add(new JLabel(m));
                ImageIcon h = new ImageIcon("rook.png");
                b.squares[0][0].add(new JLabel(h));
            }
        });
    }

答案 3 :(得分:0)

最简单的解决方案: 将图像上传到项目文件夹中。 例如,您可以使用JLabel输入图像。 然后将代码编写为以下示例:

 JLabel lblNewLabel = new JLabel("New Label");
 lblNewLabel.setIcon(new ImageIcon("Name of your image"));
 panel.add(lblNewLabel);