计时器,显示在java中使用按钮之前必须等待的秒数

计时器,显示在java中使用按钮之前必须等待的秒数,java,timer,jbutton,Java,Timer,Jbutton,我正在尝试创建一个类似于传奇联盟的游戏来进行练习,我想这样做,当你点击一个按钮时,按钮会禁用5秒,而按钮文本会变成一个计时器,显示你在再次使用该按钮之前必须等待的秒数。我成功地使按钮禁用了5秒钟,但现在我卡在计时器部分 我尝试创建一个变量,然后将其除以1000(我必须将其除以1000,因为我也将此变量用于另一个禁用按钮的计时器),但我收到一条错误消息: 类型AbstractButton中的方法setText(String)不适用于参数(int) 下面是我上面所说的代码: ImageIcon qA

我正在尝试创建一个类似于传奇联盟的游戏来进行练习,我想这样做,当你点击一个按钮时,按钮会禁用5秒,而按钮文本会变成一个计时器,显示你在再次使用该按钮之前必须等待的秒数。我成功地使按钮禁用了5秒钟,但现在我卡在计时器部分

我尝试创建一个变量,然后将其除以1000(我必须将其除以1000,因为我也将此变量用于另一个禁用按钮的计时器),但我收到一条错误消息:

类型AbstractButton中的方法setText(String)不适用于参数(int)

下面是我上面所说的代码:

ImageIcon qAbilityIcon=新的ImageIcon(getClass().getResource(“images/Jaws\u of the_Beast.png”);
JButton qAbilityBtn=新JButton(“Q”);
//创建一个计时器,禁用按钮5秒
int qCDTime=(int)5000;
计时器qCooldown=新计时器(qCDTime,new ActionListener(){
已执行的公共无效操作(操作事件evt){
qAbilityBtn.setEnabled(真);
qAbilityBtn.setText(“Q”);
}
});
qCooldown.setRepeats(false);
JLabel qAbility=新的JLabel();
qAbility.setIcon(qAbilityIcon);
qAbility.setBounds(90350,64,64);
qAbilityBtn.setBounds(903156435);
qAbilityBtn.setOpaque(假);
qAbilityBtn.setContentAreaFilled(假);
qAbilityBtn.1(假);
qAbilityBtn.setFocusable(假);
qAbilityBtn.addActionListener(e->{
int minQDmg=25;
int maxQDmg=75;
int qDmg=(int)(Math.random()*(maxQDmg-minQDmg+1)+minQDmg);
能力标签.setText(“你造成了”+qDmg+“伤害!”);
能力标签(170,10200,50);
qAbilityBtn.setEnabled(假);
//这里我得到了错误
qAbilityBtn.setText(qCDTime/1000);
qCooldown.start();
});
我知道这可能不起作用,但有人能告诉我为什么会出现这个错误,以及如何修复它吗

此外,如果这不起作用(这很可能不起作用),我如何制作计时器,显示您必须等待多少秒

我也用谷歌搜索了这个,但我没有找到我需要的,或者至少我不知道如何在我的代码中实现它

这是我的主要文件

这是我的游戏档案


我为我糟糕的英语和糟糕的解释技巧道歉

试着理解错误告诉你的是什么。您正在将类型为
int
的参数赋给需要类型为
String
的参数的函数。要解决此错误,您可以替换此行:

qAbilityBtn.setText(qCDTime/1000)

为此:

qAbilityBtn.setText(String.valueOf(qCDTime/1000))


这将解决错误,但我非常确定代码不会执行您希望它执行的操作,因为按钮上只会显示
qCDTime/1000
的当前值,它不会被更新。

可能有很多方法可以做到这一点,但我会这样做。下面大部分内容是关于GUI布局的典型模板

  • 使用摆动计时器控制事件
  • 按钮和计时器共享侦听器,并使用
    actionCommand
    确定触发事件的组件
  • 默认倒计时时间为5秒。计时器每秒发出一个事件
  • 按钮将显示剩余的秒数
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class ButtonTimer extends JPanel {
    
    JFrame f = new JFrame("Button Timer Demo");
    JButton b = new JButton("Click Me!");
    MyActionListener mal = new MyActionListener();
    Timer t = new Timer(0, mal);
    
    public ButtonTimer() {
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        add(b);
        b.addActionListener(mal);
        b.setPreferredSize(new Dimension(100, 40));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        t.setDelay(1000);
        t.setActionCommand("timer");
    }
    
    public Dimension getPreferredSize() {
        return new Dimension(200, 50);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new ButtonTimer());
    }
    
    public class MyActionListener implements ActionListener {
        public int seconds = 0;
        
        public void actionPerformed(ActionEvent ae) {
            if (ae.getActionCommand().equals("timer")) {
                if (seconds == 0) {
                    t.stop();
                    b.setText("Click Me!");
                } else {
                    b.setText(seconds + "");
                    seconds--;
                }
            } else {
                // must be button
                if (seconds == 0) {
                    // only do button action if seconds == 0
                    seconds = 5;
                    // start timer
                    t.start();
                }
            }
        }
        
    }
}