使用相同的按钮在文本字段中输入不同的文本

时间:2014-08-29 17:16:45

标签: java swing jbutton thread-sleep

我正在开发一个项目,根据使用计数器的按钮点击次数插入数字。只涉及一个按钮。按下该按钮一次后,它应在文本字段中输入1。如果在3秒内再次按下该按钮,则应该用2替换1.如果在3秒后按下该按钮,则应以相同的方式输入下一个数字。我在下面添加了我的代码。

我在这个程序上遇到了一些麻烦。当我在3秒内按下按钮两次时,它进入" 12"在JTextField中。在输入一位数字后,我也无法重置计数器。希望您理解我的问题。

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

}

3 个答案:

答案 0 :(得分: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.setText(tf.getText() + counter);

或者甚至更好,更改此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

等等。

建议不要在swing应用程序中使用thread.sleep(),我建议使用Swing Timer

thread.sleep()会使你的应用程序冻结,而摇摆计时器则不会。

答案 1 :(得分:0)

您当前的方法存在许多问题......

  1. 每次点击按钮时,您都会产生一个新的,独立的Thread。每个Thread等待3秒钟,无论
  2. 如何,都会递增计数器
  3. tf.getText()+counter实际上是在连接结果之前将counter转换为String。这意味着如果文本是" 1"并且计数器为" 2",该值将转换为" 12"而不是" 3"。相反,您应该直接将计数器转换为String
  4. 您可以通过多种方式解决此问题......

    1. 您可以检查上次点击按钮的当前时间,如果该值小于3秒,您可以增加计数器,否则您需要重置并重新开始。
    2. 您可以使用Swing Timer,其设置为3秒的非重复延迟。单击该按钮时,您将重新启动此计时器并递增counter。最终触发计时器时,您可以将counter重置为0

答案 2 :(得分:0)

如果我确实理解了你,这应该是你正在寻找的答案。如果出现问题请评论!因此,假设我们运行程序6秒,将其分为2个周期,这些周期为0 - > 3 - > 6,如果你一直按下0到3之间的按钮,jtextfield会变为单号显示,但是3秒后实际开始另外3秒,所以在你的逻辑中没有前后相互取消,所以如果你没有&#39 ; t按下按钮直到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;

}