2012-03-08 2 views
0

Я пытаюсь отобразить ImageIcon объекта класса епископ. ImageIcon извлекается с помощью getImage(). Возвращенный ImageIcon хранится в ссылке m, но он не отображается, а другой ImageIcon h, который загружается напрямую, отображается. Какую ошибку я делаю?ImageIcon не отображается

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

Соглашения Java-кода говорят, что имена классов всегда должны начинаться с прописной буквы. Вы должны переименовать епископ.ява в Bishop.java и board.java на Board.java. Это облегчает чтение кода. –

+0

@SteveMcLeod Я сожалею о плохой практике именования. Будем иметь в виду. –

+0

@deporter оба изображения находятся в одной папке –

ответ

5

Вы определили свой конструктор неправильный путь - с ненужной void. Поэтому ваш класс Bishop вызывает пустой конструктор по умолчанию, поэтому ваша переменная img никогда не устанавливается правильно. Удалите его, чтобы ваш конструктор будет называться правильно:

Вместо этого:

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

Определите без пустот:

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

хорошая отладка .. +1 – Juvanis

+0

это было место на. извините за смущающую ошибку –

+0

Мы все это делаем, я рад видеть, что я смог помочь. –

1

Недостаточно вашего кода, показанного для меня, чтобы точно рассказать. Мне нужно увидеть класс платы (btw: имена классов должны быть заглавными в 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); 
} 
+0

+1 (оба) для JLabel с иконкой, ImageIcon – mKorbel

1

Что такое доска? Я предполагаю, что это может расширить компонент Swing, например JFrame?

Все события, связанные с графическим интерфейсом, должны иметь место в потоке диспетчера событий (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)); 
      } 
     }); 
    } 
0

простое решение: Загрузить изображения в вашей папке проекта. Вы можете использовать JLabel, например, для ввода изображений. , тогда напишите свой код как следующий образец:

JLabel lblNewLabel = new JLabel("New Label"); 
lblNewLabel.setIcon(new ImageIcon("Name of your image")); 
panel.add(lblNewLabel); 
Смежные вопросы