gpt4 book ai didi

java - GUI 按钮的延迟

转载 作者:行者123 更新时间:2023-12-01 18:39:38 24 4
gpt4 key购买 nike

一小段代码有一个小问题。我想使用延迟,以便用户在单击正确的按钮后会在有限的时间内看到 GUI,然后它将重置回旧的形式。我尝试使用 thread.sleep() 代码来执行此操作,但在编译器中不断收到异常错误。我想也许可以使用 Swing 计时器来解决这个问题,但不知道这是否可行。如果您能提供有关正确行动方案的反馈,我们将不胜感激。

 import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import java.lang.Thread;




public class Test extends JFrame implements ActionListener {

JLabel label1, label2, label3;


ImageIcon image1, image2, image3, image4, image5;

JTextField textResult;

JButton [] buttons;

int treasureLocation;

int clicks = 0;



Thread td = new Thread(); //Declare thread




public static void main(String[] args) {




new Test();

}


public Test (){

this.setSize(700,700);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Treasure Hunt Game");

JPanel thePanel = new JPanel();


thePanel.setLayout(new GridLayout(0,3,0,0));

image1 = new ImageIcon(getClass().getResource("Treasure.jpg"));
image2 = new ImageIcon(getClass().getResource("Pirate.jpg"));
image3 = new ImageIcon(getClass().getResource("sand2.jpg"));
image4 = new ImageIcon(getClass().getResource("emptyhole.jpg"));
image5 = new ImageIcon(getClass().getResource("map.jpg"));

label1 = new JLabel("Click the buttons!");
label1.setFont(new Font("Serif", Font.PLAIN, 20));
label1.setForeground(Color.red);


label2 = new JLabel(image5);
label3 = new JLabel(image2);


buttons = new JButton[9];
buttons[0] = new JButton(image3);
buttons[1] = new JButton(image3);
buttons[2] = new JButton(image3);
buttons[3] = new JButton(image3);
buttons[4] = new JButton(image3);
buttons[5] = new JButton(image3);
buttons[6] = new JButton(image3);
buttons[7] = new JButton(image3);
buttons[8] = new JButton(image3);





thePanel.add(buttons[0]);
thePanel.add(buttons[1]);
thePanel.add(buttons[2]);
thePanel.add(buttons[3]);
thePanel.add(buttons[4]);
thePanel.add(buttons[5]);
thePanel.add(buttons[6]);
thePanel.add(buttons[7]);
thePanel.add(buttons[8]);
thePanel.add(label1);
thePanel.add(label2);
thePanel.add(label3);

buttons[0].addActionListener(this);
buttons[1].addActionListener(this);
buttons[2].addActionListener(this);
buttons[3].addActionListener(this);
buttons[4].addActionListener(this);
buttons[5].addActionListener(this);
buttons[6].addActionListener(this);
buttons[7].addActionListener(this);
buttons[8].addActionListener(this);



this.add(thePanel);

this.setVisible(true);



treasureLocation = new Random().nextInt(buttons.length);


System.out.println(treasureLocation);




}




public void actionPerformed(ActionEvent evt){
Object source = evt.getSource();

if (source == buttons[treasureLocation]) {


buttons[treasureLocation].setIcon(image1);
label1.setText("You've found me Treasure!");

td.sleep(3000); //Delay and reset code
Test.this.setVisible(false);
Test.this.dispose();
new Test();



}
else
{
((JButton)source).setIcon(image4);

}

clicks++;
System.out.println(clicks);
if (clicks == 5){

label1.setText("One more try Matey!");

}

if ((clicks == 6) && (source != buttons[treasureLocation])) {

label1.setText("Game over!");

}
if (clicks == 7){

Test.this.setVisible(false);
Test.this.dispose();
new Test();
}

}





}

最佳答案

线程 sleep 将使整个 GUI 进入休眠状态,包括绘画,因此切勿在 Swing 事件线程上使用此功能。请改用 Swing 计时器。

我还建议不要显示新的 JFrame 或 GUI,因为向用户抛出多个窗口可能会很烦人。

例如,

public void actionPerformed(ActionEvent e) {
final Object source = evt.getSource();

if (source == buttons[treasureLocation]) {
buttons[treasureLocation].setIcon(image1);
label1.setText("You've found me Treasure!");

Timer timer = new Timer(TIMER_DELAY, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// reset GUI including the JButton's icon
}
});
timer.setRepeats(false);
timer.start();
}
}

详情请查看Swing Timer Tutorial .

关于java - GUI 按钮的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com