我正在尝试显示类主教的对象的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);
}
}
答案 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);