ImageIcon не отображается
Вопрос
Я пытаюсь отобразить ImageIcon объекта епископа класса.ImageIcon извлекается с помощью getImage().Возвращенный 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);
}
}
Решение
Вы неправильно определили свой конструктор - с ненужным void
.Поэтому ваш Bishop
класс вызывает пустой конструктор по умолчанию, поэтому ваша переменная img
никогда не устанавливается правильно.Удалите его, чтобы ваш конструктор вызывался правильно:
Вместо этого:
public void bishop() {
img = new ImageIcon("bishop.png");
}
Определите его без void:
public bishop() {
img = new ImageIcon("bishop.png");
}
Другие советы
Там не хватает вашего кода, показанного для меня, чтобы точно сказать.Мне нужно увидеть класс доски (кстати: имена классов должны быть заглавны в 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);
}
. Что именно доска?Я предполагаю, что это то, что может продлить качание компонента, такой как Jframe?
Всеми, связанные с графическим интерфейсом, связанные с GUI, должны проходить на потоке диспетчера событий (EDT).Эта поток заботится об обновлении GUI.В тех случаях, когда вам нужно обновить GUI из другого класса, вам нужно использовать Handutivilities.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));
}
});
}
. Простое решение: Загрузите изображения в папку проекта. Вы можете использовать JLABEL, например, для входных изображений. Затем напишите свой код в качестве следующего образец:
JLabel lblNewLabel = new JLabel("New Label");
lblNewLabel.setIcon(new ImageIcon("Name of your image"));
panel.add(lblNewLabel);
.