Обработчик события изображения показывает ошибку в графическом интерфейсе Java

Я создал r Jbutton и вставил изображение в c JButton, Все, что я хочу сделать, это добавить обработчик событий в r JButton что при нажатии на изображение в c button должны быть изменены, как указано в методе roll(), Но он показывает ошибку внутри класса обработчика для строки с r.roll, Может кто-нибудь показать мне, как добавить обработчик в r JButton таким образом, что когда r JButton по нажатию выполняется метод roll и изображение меняется?

import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.*;
import java.util.Random;
import javax.imageio.*;

public class Background extends JFrame{      
  private Random ran;
  private int value;
  private JButton r;
  private JButton c;

  public Background ()
  {
    super("title");
    ran = new Random();
    value = nextValue() ;
    setLayout(new FlowLayout());

    r=new JButton("ROLL ");
    r.setForeground(Color.WHITE);//ndryshon ngjyren e shkrimit
    r.setBackground(Color.YELLOW);
    add(r,BorderLayout.SOUTH);    

    Icon i=new ImageIcon(getClass().getResource("1.png"));
    Icon im=new ImageIcon(getClass().getResource("2.png"));

    c= new JButton(i);
    add(c);

    thehandler hand=new thehandler(this);//konstruktori i handler merr nje instance te Background
    r.addActionListener(hand);
    c.addActionListener(hand);
  }

  private int nextValue() {
    return Math.abs(ran.nextInt()) % 6 + 1 ;
  }

  public void roll() {
    value = nextValue() ;
    if (value==1){
      Icon i=new ImageIcon(getClass().getResource("1.png"));
      c= new JButton(i);
      add(c);
    } else if(value==2){
      Icon im=new ImageIcon(getClass().getResource("2.png"));
      c= new JButton(im);
      add(c);
    }

    repaint() ;
  }

  public int getValue() {
    return value ;
  }

  private class thehandler implements ActionListener{
    private Background m ;

    thehandler(Background thisone) {
      m = thisone ;
    }

    public void actionPerformed(ActionEvent event) {
      m.roll();
      r.roll();//ERROR  
    }
  }

  public static void main(String[] args) {       
    Background  d = new Background() ;
    d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    d.getContentPane().setBackground(Color.GREEN);
    d.setSize(700,500);
    d.setVisible(true);  
  }
}

1 ответ

Решение

Почему вы создаете новый экземпляр JButton в roll? Вам просто нужно изменить значок кнопок, которые уже отображаются на экране

Это...

public void roll() {
    value = nextValue() ;
    if (value==1){
        Icon i=new ImageIcon(getClass().getResource("1.png"));
        c= new JButton(i);
        add(c);
    } else if(value==2){
        Icon im=new ImageIcon(getClass().getResource("2.png"));
        c= new JButton(im);
        add(c);
    }

    repaint() ;
}

должно быть...

public void roll() {
    value = nextValue() ;
    Icon i = null;
    if (value==1){
        i=new ImageIcon(getClass().getResource("1.png"));
    } else if(value==2){
        i=new ImageIcon(getClass().getResource("2.png"));
    }
    c.setIcon(i);
}

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

Если изображения не были обновлены, то, вероятно, ваши изображения не были загружены, вы можете проверить это двумя способами, во-первых, вы можете установить текст кнопок

public void roll() {
    value = nextValue() ;
    c.setText(Integer.toString(value));
    Icon i = null;
    if (value==1){
        i=new ImageIcon(getClass().getResource("1.png"));
    } else if(value==2){
        i=new ImageIcon(getClass().getResource("2.png"));
    }
    c.setIcon(i);

    repaint() ;
}

и во-вторых, вы должны использовать ImageIO.read загрузить ресурсы, например...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Background extends JFrame {

    private Random ran;
    private int value;
    private JButton r;
    private JButton c;

    public Background() {
        super("title");
        ran = new Random();
        value = nextValue();
        setLayout(new FlowLayout());

        r = new JButton("ROLL ");
        r.setForeground(Color.WHITE);//ndryshon ngjyren e shkrimit
        r.setBackground(Color.YELLOW);
        add(r);

        try {
            BufferedImage die = ImageIO.read(getClass().getResource("1.png"));
            c = new JButton(new ImageIcon(die));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        add(c);

        thehandler hand = new thehandler(this);//konstruktori i handler merr nje instance te Background
        r.addActionListener(hand);
        c.addActionListener(hand);
    }

    private int nextValue() {
        return Math.abs(ran.nextInt()) % 6 + 1;
    }

    public void roll() {
        value = nextValue();
        c.setText(Integer.toString(value));
        URL path = null;
        if (value == 1) {
            path = getClass().getResource("1.png");
        } else if (value == 2) {
            path = getClass().getResource("2.png");
        }
        try {
            BufferedImage die = ImageIO.read(path);
            c.setIcon(new ImageIcon(die));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public int getValue() {
        return value;
    }

    private class thehandler implements ActionListener {

        private Background m;

        thehandler(Background thisone) {
            m = thisone;
        }

        public void actionPerformed(ActionEvent event) {
            m.roll();
        }
    }

    public static void main(String[] args) {
        Background d = new Background();
        d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        d.getContentPane().setBackground(Color.GREEN);
        d.setSize(700, 500);
        d.setVisible(true);
    }
}

Это мой кинь NullPointerException, что означает, что Java не может найти ваши изображения. Исходя из вашего кода, ваши изображения должны храниться в том же пакете, что и ваш класс

Посмотрите на Чтение / Загрузка изображения для более подробной информации о ImageIO

Проблема с этим...

r.roll();//ERROR  

является JButton не имеет roll метод

Другие вопросы по тегам