使用JButton ActionListener刷新jFrame

时间:2014-10-01 13:15:05

标签: java swing jframe jbutton actionlistener

我正在尝试一个简单的应用程序,它可以选择4张随机卡并在4个按钮上显示它们到目前为止一切都很好我想要添加一个刷新按钮来刷新每个随机部分时间已被调用,但我无法完成,我已尝试revalidate();repaint();但没有成功。
我希望有人可以帮助我,提前谢谢。

    import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class rest extends JFrame{
    public rest(){
        int x=(int)(Math.random()*55);
        int y=(int)(Math.random()*55);
        int z=(int)(Math.random()*55);
        int b=(int)(Math.random()*55);
        ImageIcon i1= new ImageIcon("image/card/"+x+".png");
        ImageIcon i2= new ImageIcon("image/card/"+y+".png");
        ImageIcon i3= new ImageIcon("image/card/"+z+".png");
        ImageIcon i4= new ImageIcon("image/card/"+b+".png");
        JButton b1 = new JButton();
        b1.setIcon(i1);     
        JButton b2 = new JButton();
        b2.setIcon(i2);
        JButton b3 = new JButton();
        b3.setIcon(i3);
        JButton b4 = new JButton();
        b4.setIcon(i4);
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(1,4,5,5));
        p.add(b1);      
        p.add(b2);
        p.add(b3);
        p.add(b4);
        JPanel p1= new JPanel();
        JButton b5 = new JButton("refresh");
        p1.setLayout(new BorderLayout());
        p1.add(b5,BorderLayout.EAST);
        setLayout(new BorderLayout());
        add(p,BorderLayout.CENTER);
        add(p1,BorderLayout.SOUTH);
        b5.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //revalidate();
                //repaint();
            }
        });
    }

    public static void main(String[] args) {
        rest f= new rest();
        f.setTitle("poker");
        f.setSize(300,300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.setVisible(true);

    }

}

1 个答案:

答案 0 :(得分:1)

revalidate/repaint什么都不做。您需要实际创建新的随机图标并再次将图标设置为按钮,例如

@Override
public void actionPerformed(ActionEvent e) {
    int random = (int)(Math.random()*55);
    b1.setIcon(new ImageIcon("image/card/"+random+".png"));
    random = (int)(Math.random()*55);
    b2.setIcon(new ImageIcon("image/card/"+random+".png"));
    random = (int)(Math.random()*55);
    b3.setIcon(new ImageIcon("image/card/"+random+".png"));
    random = (int)(Math.random()*55);
    b4.setIcon(new ImageIcon("image/card/"+random+".png"));
}

您还需要将按钮声明为final,因为您是从匿名类本地访问它们,即final JButton b1 = new JButton();


作为旁注,如果继续在本地创建所有对象,则随着应用程序的增长,构造函数将变得非常大。您可能需要考虑使用某些类成员。也许创建按钮作为类成员。然后有一个方法reset(),它将使用新的随机图标初始化按钮。首先,这将消除重复的代码,就像在这种情况下,你使用两组代码完成相同的事情。而只是调用方法。一次,在构造函数中首先初始化它们,然后在重置监听器

中再次调用它

还使用Java命名约定。类名以大写字母开头。 rest - > Rest