【问题标题】:Delay for gui buttongui按钮的延迟
【发布时间】:2013-12-09 21:21:34
【问题描述】:

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

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

  }





   }

【问题讨论】:

    标签: java swing jbutton delay


    【解决方案1】:

    线程睡眠将使整个 GUI 进入睡眠状态,包括绘画,因此永远不要在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      相关资源
      最近更新 更多