Fazendo backspace em java

[b]
Pessoal, eu tô fazendo uma Calculadora em Java usando swing e tô querendo colocar um Backspace na minha calculadora.

Para o caso de o usuário digitar um número errado, ele possa apagar aquele numero errado e digitar denovo…

Esse é o código:
[/b]

private void apagarActionPerformed(java.awt.event.ActionEvent evt) {                                       
// TODO add your handling code here:
        
        String str = jTextField1.getText(); // aqui eu pego o q tá na jTextField

        char ch = str.charAt( str.length() ); // aqui eu atribuo a última letra da String a um char

        str = str.replace(String.valueOf(ch),""); // aqui eu troco a última letra por ""
        jTextField1.setText(str);
        
    }


Só q não funciona…
Quando eu clico no botão o NetBeans mostra isso:

compile-single:
run-single:
Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
        at java.lang.String.charAt(String.java:558)
        at calculadora1.Calculadora1.apagarActionPerformed(Calculadora1.java:271)
        at calculadora1.Calculadora1.access$1700(Calculadora1.java:13)
        at calculadora1.Calculadora1$18.actionPerformed(Calculadora1.java:172)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:5488)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
        at java.awt.Component.processEvent(Component.java:5253)
        at java.awt.Container.processEvent(Container.java:1966)
        at java.awt.Component.dispatchEventImpl(Component.java:3955)
        at java.awt.Container.dispatchEventImpl(Container.java:2024)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
        at java.awt.Container.dispatchEventImpl(Container.java:2010)
        at java.awt.Window.dispatchEventImpl(Window.java:1778)
        at java.awt.Component.dispatchEvent(Component.java:3803)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)


Alguém pode me ajudar??

Essa linha está gerando o erro:

char ch = str.charAt( str.length() );

Tem que ser (str.length()-1).

Tem que ser assim porque os indices da string começam em zero.

TESTE
01234

str.length() = 5

[b]
Caramba heim! só por causa disso!
uHAuHAuhUAHU!

brigadão cara, muito obrigado pela resposta, me ajudou muito. :smiley:

mas cara, eu rodei o programa agora e percebi q esse trecho do código:
[/b]

(...)
str = str.replace(String.valueOf(ch),"");
(...)

[b]
tá apagando todos os caracteres iguais.
por exemplo: Se o usuário digitar 1156711, e clicar no botão vai aparecer no jTextField somente 567

eu não queria q fosse assim. queria q apagasse somente a última letra da String.

o replace tá fazendo o trabalho dele diteitinho UAHuHAuHA
mas não é assim q eu quero.

alguém sabe o q eu posso fazer agora?
[/b]

Use a classe StringBuilder pra fazer isso.

Veja a documentação dela. Lá tem métodos pra substituir caractere por caractere.

No final é só usar o metodo toString() pra pegar a string e jogar no teu text field.

:slight_smile:

Você vai precisar especificamente desse método:

public void setCharAt(int index, char ch)

Documentação:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuilder.html

[b]
Ow cara!! Brigadão! :smiley:
consegui fazer o Backspace!!!
eu usei o deleteCharAt

Aew o código, tá funcionando direitinho:
[/b]

    private void apagarActionPerformed(java.awt.event.ActionEvent evt) {                                       
// TODO add your handling code here:
        
        String str = jTextField1.getText();
        StringBuilder w = new StringBuilder(str);
        str = String.valueOf( w.deleteCharAt(str.length() - 1) );
        jTextField1.setText(str);
        
    }


Valew cara, muito obrigado pelas respostas. Me ajudaram muito!!!
té +