将事件处理程序添加到JButton以重新绘制Java GUI中的图像时出错

时间:2016-01-21 23:06:53

标签: java swing awt jbutton repaint

我创建了2个JButtons.One中的一个具有按钮功能,另一个处理图像。我希望在单击此按钮时更改该图像。所以插入方法repaint()并添加一个监听器第一个改变图像的JButton。当试图将侦听器或事件处理程序添加到第一个JButton时没有任何事情发生。因此图像不会改变。任何人都可以告诉我如何以其工作方式插入此侦听器(单击按钮时更改图像)?这是我的代码:

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

public class Back extends JFrame{

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

    public Back(){


        super("title");
        ran = new Random();
        value = nextValue();
        setLayout(new FlowLayout());
        r=new JButton("ROLL");
        add(r);
         Icon i=new ImageIcon(getClass().getResource("1.png"));
         Icon img=new ImageIcon(getClass().getResource("2.png"));
         c= new JButton(i);

        if (value==1){
             c= new JButton(i);

        }
        else if(value==2){
             c= new JButton(img);

        }
        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() ;

         repaint() ;
         }
     public int getValue() {
         return value ;
         }
     private class thehandler implements ActionListener{
         private Back d;
         thehandler(Back thisone) {
                d = thisone ; }
         public void actionPerformed(ActionEvent event) {
             d.roll() ;
         }
         }
    public static void main(String[] args) {

         Back  d = new Back() ;

         d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         d.getContentPane().setBackground(Color.GREEN);
         d.setSize(700,500);

         d.setVisible(true);    
    }
}

1 个答案:

答案 0 :(得分:1)

所以,基本上,你所有的代码都归结到这里......

public void roll() {
    value = nextValue();

    repaint();
}

这会计算一个新的随机值并调用重绘。但是,value在你的代码中没有任何内容会被调用。

相反,您需要更新某些控件的状态,可能更像是......

public void roll() {
    value = nextValue();

    Icon i = new ImageIcon(getClass().getResource("1.png"));
    Icon img = new ImageIcon(getClass().getResource("2.png"));
    if (value == 1) {
        c.setIcon(i);
    } else if (value == 2) {
        c.setIcon(img);
    }
}

我要做的下一件事是将所有图像存储在某种数组或List中以便于访问,然后您可以简单地执行某些操作 像...

public void roll() {
    value = nextValue();
    c.setIcon(listOfImages.get(value - 1));
}

可能需要查看Java Swing Timer and Animation: how to put it together以获取更详细的示例