2015-06-19 2 views
0

Есть ли способ обнаружить, когда нажата клавиша обратного пробела на клавиатуре, используя фильтр документов? The following is an edited code extract from hereОбнаружение нажатия клавиши backspace

Для примера

public class IntFilter extends DocumentFilter { 
    boolean trueFalse = true; 
    public void insertString(DocumentFilter.FilterBypass fb, int offset, 
          String string, AttributeSet attr) 
      throws BadLocationException { 

     StringBuffer buffer = new StringBuffer(string); 
     for (int i = buffer.length() - 1; i >= 0; i--) { 
      char ch = buffer.charAt(i); 
      if (!Character.isDigit(ch)) { 
       buffer.deleteCharAt(i); 
       trueFalse = false; 
      } 
      /* 
      else if (backspace pressed) 
      { 
       trueFalse = true; 
      } 
      */ 
      else{ 
       trueFalse = true; 
      } 
     } 
     super.insertString(fb, offset, buffer.toString(), attr); 
    } 

    public void replace(DocumentFilter.FilterBypass fb, 
         int offset, int length, String string, AttributeSet attr) throws BadLocationException { 
     if (length > 0) fb.remove(offset, length); 
     insertString(fb, offset, string, attr); 
    } 
} 
+0

Нужно ли использовать фильтр документов? – nom

+0

@NabeelOmer За этот вопрос да. В реальной программе я в настоящее время экспериментирую с DocumentListener – Dan

ответ

0

При нажатии клавиши возврата не будет вызывать метод insertString(). Он должен скорее инициировать метод remove() (только когда текст действительно удален, что не так, когда каретка находится в начале текста, например).

Но вы можете обнаружить любую комбинацию клавиш с помощью KeyListener (doc). Вот как вы могли бы обнаружить ключ backspace:

public class KeyEventDemo implements KeyListener { 

    /** Handle the key typed event from the text field. */ 
    public void keyTyped(KeyEvent e) {} 

    /** Handle the key-pressed event from the text field. */ 
    public void keyPressed(KeyEvent e) {} 

    /** Handle the key-released event from the text field. */ 
    public void keyReleased(KeyEvent e) { 
     if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE){ 
      // Do something... 
     } 
    } 

} 
+0

. Как бы вы это сделали, чтобы ключ backspace активировал remove()? Когда я пытался добавить это, он вызывался каждый раз, когда нажимали любую клавишу, а не только клавишу backspace? – Dan

+0

'remove()' вызывается при нажатии клавиши * any *? Если это так, возможно, что-то не так. 'remove()' вызывается, когда текст удаляется, что может произойти при нажатии backspace или * Suppr * или при нажатии любой клавиши, пока выбран какой-либо текст (который сначала удаляет текст, а затем вставляет новый текст). –

0

Насколько я знаю, нет способа обнаружить это в DocumentFilter.

Если вы выберете символ и нажмите DEL, он будет таким же, как вы нажмете BACKSPACE. Смещение и длина удаленного текста идентичны.

Вместо этого вы можете определить KeyBinding для обработки BACKSPACE и поместить там свой код.

+0

И в этом примере, что вы предлагаете, я добавляю привязку клавиш? – Dan