2014-08-29 4 views
0

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

}

+0

Не заворачивайте ваша логика в потоке, каждый раз, когда вы нажимаете кнопку, вы начинаете совершенно новый и независимый поток. – MadProgrammer

ответ

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

И так далее.

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

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

+0

Это будет замаскировать проблему. Реальная проблема заключается в подходе OP. – dasblinkenlight

+0

yep только что заметил, что он получал текст из текстового поля и добавлял его в стойку. См. Edit @dasblinkenlight – Frakcool

0

Есть целый ряд проблем, связанных с вашим текущим подходом ....

  1. Вы порождая новую, независимую, Thread каждый раз, когда нажата кнопка.Каждый Thread ждет 3 секунды, а приращение счетчика независимо
  2. tf.getText()+counter фактически преобразует counter в String, прежде чем он объединяет результат. Это означает, что если текст «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. Вы можете нажать 3secondsbutton столько, сколько сможете за каждые 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(); 

} 

Overide Таймер

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; 

}  
Смежные вопросы