Проблемы с графикой Java - PullRequest
5 голосов
/ 13 января 2012

Я новичок в Java, и для своего первого проекта я начал создавать игру Monopoly.

Я строю графический интерфейс в SWING, используя метод Graphics.

Появились две проблемы, которые яне могу найти ответ.

Во-первых, кажется, что я не могу установить цвет фона для своей JPanel, которую я ранее делал таким же образом в другой JPanel в том же проекте.

Во-вторых, я получаю NullPointerException при попытке добавить изображение. Мне удалось исправить эту ошибку с try/catch, но кажется, что Графика не будет рисовать. Опять я использовалтот же метод загрузки и добавления изображений в предыдущем JPanel, и он сработал.

Следует отметить, что мой JFrame на данный момент содержит 3 элемента в каждом отдельном классе и добавляется с помощью BorderLayout ().

Это код для класса, который создает проблемы:

    public class MonopolyBoard extends JPanel{


    Image atlantic;
    MonopolyBoard() {
        this.setBorder(new EtchedBorder());

        this.setBackground(new Color( (80), (180), (210) )); //this code dosent work

        //this throws exception without try catch
        try{
        ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/Atlantic Ave.jpg"));
         atlantic = a.getImage();
       }
       catch(NullPointerException e){}
       }

    public void paint(Graphics g){

          }
          Graphics2D g2 = (Graphics2D) g; 
         //this code should draw the image but it dosent
          g2.drawImage(atlantic, 100, 100, null);
          g.drawImage(atlantic, 100, 100, this);

    };
}

Ответы [ 3 ]

1 голос
/ 13 января 2012

Вы не узнаете, если не распечатаете трассировку стека внутри блока catch. Если конструктор new ImageIcon() не выдает исключение и вместо этого возвращает нулевой объект, следующая строка, a.getImage(), обязательно вызовет NPE, поскольку вы не можете вызвать метод для нулевого объекта.

Вместо этого

 //this throws exception without try catch         
 try
 {           
     ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg"));
     atlantic = a.getImage();        
 }        
 catch(NullPointerException e){}   

Попробуйте это

// the next line may be wrapped incorrectly due to MarkDown
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg"));
if (a == null)
{
    System.out.println("Can not find AtlanticAve.jpg");
    return;
}
     atlantic = a.getImage();        

Линия

 // the next line may be wrapped incorrectly due to MarkDown
 ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg"));

По сути, вам нужно начать с просмотра того, что может вызвать конструктор, если ImageIcon вернет нулевой объект. Это поможет вам на правильном пути. Это может быть что-то из-за неудачного вызова getResource (). Простой способ выяснить это состоит в том, чтобы разделить вышеприведенную строку на ее части и дать им свои собственные переменные результата. Это грязно и неэффективно, но вот как иногда происходит устранение неполадок.

// using _var_ because I'm too lazy to look up the return types of the methods
var x1 = this.getClass().getResource("../Card/AtlanticAve.jpg");
if (x1 == null)
{
   System.out.println("Can't find my resource");
}

Вы получите изображение

1 голос
/ 13 января 2012

Установка цвета фона не имеет никакого эффекта, потому что вы переопределяете paint ().Краска отвечает за рисование фона.

Вам нужно нарисовать фон в вашем методе рисования:

public void paint(Graphics g){
    // paint the background
    g.fill(); // not sure about the parameters
    // paint your image
    g.drawImage(...);
}
1 голос
/ 13 января 2012

Я очень запутался с вашим кодом, но я думаю, что проблема в том, что ваша панель не рисует !, ваш метод рисования должен быть

@Override
public void paintComponent(Graphics g){
    Graphics2D g2 = (Graphics2D) g; 
    //this code should draw the image but it dosent
     g2.drawImage(atlantic, 100, 100, null);
     g.drawImage(atlantic, 100, 100, this);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...