2014-08-29 79 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; 

}  
相关问题