Использование той же кнопки для ввода другого текста в текстовое поле

Я работаю над проектом по вставке чисел на основе количества нажатий кнопок с использованием счетчика. Задействована только одна единственная кнопка. Когда эта кнопка нажата один раз, она должна ввести 1 в текстовое поле. Если эта кнопка будет нажата еще раз в течение 3 секунд, 1 следует заменить на 2. Если ее нажать через 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();
}

}


person Kaushik    schedule 29.08.2014    source источник
comment
Не оборачивайте свою логику в поток, каждый раз, когда вы нажимаете кнопку, вы запускаете совершенно новый и независимый поток.   -  person MadProgrammer    schedule 30.08.2014


Ответы (3)


Вот ваша проблема:

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 клик

tf = 1

затем вы попадаете в воображаемое String, назовем его textOfTF

textOfTF = 1

2 клика

textOfTF = 1 (потому что вы получили его от tf.getText()) 2

So

textOfTF = 12

И так далее.

И в качестве рекомендации не используйте thread.sleep() в приложениях Swing, я бы рекомендовал использовать Таймер свинга.

thread.sleep() заставит ваше приложение зависнуть, а таймер качания - нет.

person Frakcool    schedule 29.08.2014
comment
Это замаскирует проблему. Настоящая проблема заключается в подходе OP. - person Sergey Kalinichenko; 29.08.2014
comment
да, только что заметил, что он получает текст из текстового поля и добавляет его в счетчик. Смотрите редактировать @dasblinkenlight - person Frakcool; 29.08.2014

Есть ряд проблем с вашим нынешним подходом....

  1. Вы порождаете новый, независимый Thread каждый раз, когда нажимаете кнопку. Каждый Thread ждет 3 секунды и увеличивает счетчик независимо от
  2. tf.getText()+counter фактически преобразует counter в строку, прежде чем объединить результат. Это означает, что если текст равен «1», а счетчик равен «2», значение будет преобразовано в «12», а не в «3». Вместо этого вы должны просто преобразовать счетчик в String напрямую

Есть несколько способов решить эту проблему...

  1. Вы можете проверить текущее время по сравнению с последним нажатием кнопки, если значение меньше 3 секунд, вы можете увеличить счетчик, в противном случае вам нужно будет сбросить и начать заново.
  2. Вы можете использовать Swing Timer, для которого установлена ​​неповторяющаяся задержка в 3 секунды. Когда кнопка нажата, вы должны перезапустить этот таймер и увеличить значение counter. Когда таймер, наконец, сработает, вы сбросите counter на 0.
person MadProgrammer    schedule 29.08.2014

Если я правильно вас понял, это должен быть ответ, который вы ищете. Пожалуйста, прокомментируйте, если что-то не так! Итак, предположим, что мы запускаем программу в течение 6 секунд, которые разделены на 2 периода: 0 -> 3 -> 6, если вы продолжаете нажимать кнопку между 0 и 3, jtextfield изменяется на отображение одного числа, но через 3 секунды еще 3 секунды начинается на самом деле, поэтому в вашей логике нет до и после, они отменяют друг друга, поэтому, если вы не нажмете кнопку до 6 секунд, будут отображаться 1 и 2. Вы можете нажимать 3-секундную кнопку столько раз, сколько сможете каждые 3 секунды, что изменит только режим отображения на одно значение. На самом деле режим отображения меняется с нескольких чисел на одно число или наоборот каждые 3 секунды, что зависит от того, нажата кнопка или нет. Если вы хотите изменить начало отображения нескольких чисел с последнего значения, я имею в виду, что не с начала, вам нужно сохранить последнее значение и начать отображение с этой точки, поэтому вам может потребоваться внести некоторые изменения в приведенный ниже код.

введите здесь описание изображения

Ваши поля должны быть такими

    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;

}     
person mussdroid    schedule 30.08.2014