"AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: -1

Em um campo jtextfield invoco keyevent nele

private void tf_pTKeyTyped(java.awt.event.KeyEvent evt) {                                      
        String query2 = tf_pT.getText();

        String query = query2.replace("(", "").replace(" ", "").replace("-", "").replace("_", "").replace(")", "");

         if (query.length() >= 0) {
              query = query.substring(0, query.length() - 1);
             System.out.println("query = "+query); //aqui esta o que retorna!
         }
//      System.out.println("query = " + query);
    }  

o problema e o seguinte quando to no jtextfield tenho la um texto FORUM_GUJ e aperto backspace para ele deletar string ele entra no meu IF e execulta a substring mas no meu primeiro backspace ele retorna (System.out.println("query = " + query);) isso FORUM_G invez de FORUM_GU
OBS: o retorno que estou mencionando eh o retorno do system out println e nao o retorno do que tem escrito no jtextfield!
, e se no FORUM_G eu continuar dando backsapce para deletar as string ele entra no if e vai tirando 1 por 1 corretamente mas o problema eh no meu primeiro backspace que invez de deletar apenas 1 string e retornar com apenas 1 string deletada ele deleta 2 string , e quando falta 1 string para ser deletada e eu deleto ele gera esse erro

"AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: -1

invez de isso aqui

query = query.substring(0, query.length() - 1);

retirar apenas 1 string ele da primeira vez tira 2 =/

sendo que ainda tem uma string na memoria dele! alguem pode me salvar?

Agradeco desde ja atencao!!!

Só olhando seu erro, sua reclamação quanto ao FORUM_G 99% de resolver modificando isto:

query = query.substring(0, query.length() - 1); 

para isto:

query = query.substring(0, query.length()); 

Dê uma olhada na API… KeyEvents recebem dados diferentes quando o que é chamado um keyPressed ou um keyReleased.
E dê uma olhada no substring e você vai entender o porque do ArrayIndexOutOfBounds…blablabla

Tenta trocar para KeyReleased.

[]'s.