2014-08-29 46 views
0

我正在使用計數器根據按鈕單擊次數插入數字。只涉及一個按鈕。當該按鈕被按下一次時,它應該在文本字段中輸入1。如果在3秒內再次按下該按鈕,則應將1替換爲2.如果在3秒後按下該按鈕,則應以相同的方式輸入下一個數字。我在下面添加了我的代碼。使用相同的按鈕在文本框中輸入不同的文本

我在這個程序中遇到了一些麻煩。當我在3秒內按下按鈕兩次時,它會在JTextField中輸入「12」。在輸入一位數字後,我也無法重置計數器。希望您理解我的問題。

package timertry; 


    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.MouseAdapter; 
    import java.awt.event.MouseEvent; 
    import java.awt.event.MouseListener; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JTextField; 


public class TimerTry extends JFrame implements ActionListener{ 

public JFrame panel1; 
JTextField tf; 
JButton button; 
int counter=0; 

public TimerTry() { 
    panel1=new JFrame("Single button keypad try"); 
    panel1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

    tf=new JTextField(); 
    tf.setEnabled(false); 
    tf.setHorizontalAlignment(JTextField.CENTER); 



    button=new JButton(); 
} 
public void launchFrame(){ 
    panel1.setLayout(null); 
    panel1.setVisible(true); 
    panel1.setExtendedState(JFrame.MAXIMIZED_BOTH); 

    panel1.add(tf); 
    tf.setSize(300, 50); 
    tf.setLocation(500, 150); 
    tf.setEnabled(false); 
    tf.setHorizontalAlignment(JTextField.CENTER); 







    panel1.add(button); 
    button.setSize(360,50); 
    button.setLocation(900, 250); 
    button.setLabel("Press"); 
    button.setHorizontalAlignment(JTextField.CENTER); 
    button.addActionListener(this); 



} 





public static void main(String[] args) { 
    // TODO code application logic here 
    TimerTry tt=new TimerTry(); 
    tt.launchFrame(); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    Thread thread=new Thread(){ 
     @Override 
     public void run(){ 
      try{ 

       sleep(3000); 
       counter++; 
       if(counter==1){ 
        tf.setText(tf.getText()+counter); 
       } 
       else if(counter==2){ 
        tf.setText(tf.getText()+counter); 
       } 
       else if(counter==3){ 
        tf.setText(tf.getText()+counter); 
       } 
       else { 
        tf.setText(tf.getText()+counter); 
       } 


      } 
      catch(Exception ex){ 
       ex.printStackTrace(); 
      } 
     } 
    }; 
    thread.start(); 
} 

}

+0

保鮮膜別你的邏輯在一個線程內,每當你按下一個按鈕,你就開始一個全新的獨立線程 – MadProgrammer 2014-08-29 20:37:30

回答

0

這是你的問題:

if(counter==1){ 
    tf.setText(tf.getText()+counter); 
} 
else if(counter==2){ 
    tf.setText(tf.getText()+counter); 
} 
else if(counter==3){ 
    tf.setText(tf.getText()+counter); 
} 
else { 
    tf.setText(tf.getText()+counter); 
} 

之前每個tf.setText(tf.getText() + counter);

甚至更​​好只需添加tf.setText("");,這一個改變你的try-catch

try{ 
    sleep(3000); 
    counter++; 
    tf.setText(String.valueOf(counter)); 
} 
catch(Exception ex){ 
    ex.printStackTrace(); 
} 

,而不是從tf只是設置文本獲取文本,它將取代,而不是重新加入它有文字。

你的程序做:

1 CLIC

tf = 1

,那麼你在一個假想的String得到姑且稱之爲textOfTF

textOfTF = 1

2 CLIC

textOfTF = 1(因爲你從tf.getText()得到它)2

所以

textOfTF = 12

等。

而作爲建議不要在鞦韆應用上使用thread.sleep(),我會推薦使用Swing Timer

thread.sleep()將使您的應用程序凍結,同時擺動計時器沒有。

+0

這就是要掩蓋問題。真正的問題在於OP的方法。 – dasblinkenlight 2014-08-29 17:21:12

+0

yep剛剛注意到他正在從textfield獲取文本並將其添加到計數器中。請參閱編輯@dasblinkenlight – Frakcool 2014-08-29 17:22:08

0

有許多與你當前的方法問題....

  1. 一個新的,獨立的,Thread每個按鈕被點擊一次你產卵。每個Thread等待3秒,並且計數器的增量無論如何不管
  2. tf.getText()+counter實際上將counter轉換爲字符串,然後連接結果。這意味着如果文本是「1」而計數器是「2」,則該值將被轉換爲「12」,而不是「3」。相反,你應該只櫃檯轉換爲String直接

有很多的方式,你可能會解決這個問題...

  1. 您可以查看當前的時間對最後一次按鍵被點擊,如果這個值小於3秒,你可以增加計數器,否則你需要重置並重新開始。
  2. 您可以使用Swing Timer,它設置爲3秒的非重複延遲。點擊按鈕後,您將重新啓動此計時器並遞增counter。當定時器最終被觸發時,你會將counter重置爲0
0

如果我確實理解了你的話,這應該是你正在尋找的答案。請評論是否有問題!因此,假設我們運行程序6秒,分爲2個週期,這些是0 - > 3 - > 6,如果您在0和3之間按住按鈕,則jtextfield將更改爲單個數字顯示,但3秒後會再過3秒實際上開始,所以在你的邏輯之前和之後沒有,他們相互抵消,所以如果你不按下按鈕,直到6秒1和2將被顯示。您可以每3秒鐘按3秒按鈕,這樣只會將顯示模式更改爲單個值。實際上,顯示模式從多個數字變爲單個數字,反之亦然,每3秒鐘取決於是否按下按鈕。如果你想改變多個數字顯示從最後一個值開始,我的意思不是從一開始你需要保留最後一個值並從那一點開始顯示,所以你可能需要對下面的代碼做一些修改。

enter image description here

你的字段應該是這樣的

int count=0; 
    String currenttext = ""; 
    boolean key; 
    int seconds = 0; 

啓動按鈕操作

private void startbuttonActionPerformed(java.awt.event.ActionEvent evt) {           

     timer(); 
     threesecondsbutton.setEnabled(true); 

    } 

定時調用方法

public void timer(){ 

    timer.setInitialDelay(3000); 
    timer.start(); 

} 

超越控制定時器

private Timer timer = new Timer(3000, new ActionListener() { 

@Override 
public void actionPerformed(ActionEvent e) { 

    // Single Display 
    if(key==true) 
    { 

     count++; 
     currenttext = currenttext + Integer.toString(count); 
     jTextField1.setText(Integer.toString(count)); 

    } 

    // Multi Display 
    else 
    { 
     count++; 
     currenttext = currenttext + Integer.toString(count); 
     jTextField1.setText(currenttext); 


    } 

    seconds = seconds + 3; 
    jLabel3.setText(Integer.toString(seconds)); 

    key = false ; 


} 
}); 

按鈕3秒鐘這個按鈕設置鍵檢查按下按鈕3秒鐘內或3秒後

private void threesecondsbuttonActionPerformed(java.awt.event.ActionEvent evt) {           

     count++; 
     currenttext = currenttext + Integer.toString(count); 
     jTextField1.setText(Integer.toString(count)); 
     key = true; 

}  
相關問題