2015-12-17 8 views
1

Я пытаюсь создать кнопку «удалить», которая удаляет либо a) один символ в текстовой области, если он будет нажат и выпущен в быстрой последовательности, либо b) все текст при нажатии и удерживании более 2 секунд без отпускания.Как вызвать второй обработчик события после задержки

Возможно ли это на Java?

+0

Привет, добро пожаловать в StackOverflow! Пожалуйста, разместите код и покажите нам, что вы пробовали. – msanford

+4

В кнопочном режиме удалите символ и запустите 2-секундный таймер Swing; На buttonUp, убить таймер. Если таймер когда-либо называет зарегистрированный ActionListener (он вызывается до того, как buttonUp убивает его), удалите оставшуюся часть текста. – FredK

+0

Как предложил @msanford, этот вопрос нуждается в серьезном улучшении. Я сделал все, что мог, с заголовком/содержанием, но вам решать, как это сделать. Например, попробуйте [этот] (http://stackoverflow.com/help/how-to-ask). –

ответ

0

Для того чтобы определить длинные нажатия клавиш с клавиатуры, вам необходимо понять и использовать 2 понятия:
1. KeyListener.
2. Как получить current time.
Как только вы понимаете оба, просто сравните время между keyPressed и keyReleased и вызовите правильное действие удаления.

0

В качестве альтернативы Swing-Timer (например, here) вы можете использовать простой SwingWorker для реализации задержки. В общем случае вы не должны выполнять задержку, то есть на Thread.sleep(1000), на Swing EDT, так как это блокирует gui (for further information ...). Кроме того, вы должны использовать MouseListener для получения необходимой информации (остановка таймера при отпускании мыши или выход из зоны кнопки). Вот очень короткий пример:

public class JButtonTest extends JFrame { 

    public static void main(String[] args) { 
     JButtonTest x = new JButtonTest(); 
     JButton button = new JButton("Delete"); 
     button.addMouseListener(new MouseAdapter() { 
      private static final long DELTA = 2000; 
      private SwingWorker<Void, Void> waitingWorker; 
      private Long timer; 

      @Override 
      public void mousePressed(MouseEvent e) { 
       timer = System.currentTimeMillis(); 
       System.out.println("delete single char");//DO single delete here 
       if (waitingWorker != null && !waitingWorker.isDone()) 
        waitingWorker.cancel(true); 
       waitingWorker = new SwingWorker<Void, Void>() { 
        @Override 
        protected Void doInBackground() throws Exception { 
         Thread.sleep(DELTA); 
         return null; 
        } 
        @Override 
        protected void done() { 
         if (timer != null && System.currentTimeMillis() >= timer + DELTA) 
          System.out.println("delete all text");//DO text delete here 
        } 
       }; 
       waitingWorker.execute(); 
      } 
      @Override 
      public void mouseReleased(MouseEvent e) { 
       timer = null; 
      } 
      @Override 
      public void mouseExited(MouseEvent e) { 
       timer = null; 
      } 
     }); 

     x.add(button); 
     x.setSize(100, 100); 
     x.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     x.setVisible(true); 

    } 

} 
+0

У меня уже есть что-то подобное, но удаление должно произойти без выпуска кнопки мыши –

+0

Спасибо, что работает. –

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