2013-12-09 6 views
0

아주 작은 코드에 약간의 문제가 있습니다. 나는 사용자가 정확한 버튼을 클릭 한 후 제한된 시간 동안 gui를 볼 수 있도록 지연을 사용하고 싶었고 이전 버전으로 재설정했다. 나는 이것을하기 위해 thread.sleep() 코드를 사용하려고 시도했지만 컴파일러에서 예외 오류가 계속 발생했습니다. 아마도 스윙 타이머를 사용하는 작업이 가능할 지 모르겠습니다. 올바른 행동 방침에 대한 의견을 보내 주시면 감사하겠습니다.gui 버튼 지연

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

    } 





    } 

답변

4

스레드 수면은 그림을 포함하여 전체 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 봐.