首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JButton ActionListener刷新JButton

用JButton ActionListener刷新JButton
EN

Stack Overflow用户
提问于 2014-10-01 13:15:04
回答 1查看 1.3K关注 0票数 0

我正在尝试一个简单的应用程序,它可以选择4张随机卡片并显示在4个按钮上--到目前为止,这一切都很好--我想添加一个刷新按钮,每次调用它时都会刷新随机部分,但是我做不到,我尝试了revalidate();repaint();,但没有成功。

我希望有人能帮我这个忙,谢谢。

代码语言:javascript
复制
    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);

    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-01 13:55:18

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

代码语言:javascript
复制
@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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26142280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档