Completar digitação de caracteres [Resolvido]

3 respostas
F

Mais uma dúvida minha com o Swing… Se alguém puder me ajudar, meu problema é assim:

Tenho um JTextArea e eu quero, toda vez que eu digitar o caracter “[” automaticamente seja completado com o “]” e o cursor fique posicionado entre os colchetes. Tipo o editor de códigos de NetBeans. Esta ação deve ser gerada cada vez que eu pressionar as teclas “CTRL + Espaço”.

Se alguém pelo menos dizer o que eu devo pesquisar já ficaria muito agradecido, pois estou meio sem direção. Eu tentei caputar o texto digitado no JTextArea assim:

if(jTextArea_Formula.getText() == "["){ //Mais código aqui }
Mas acho que não é a maneira ideal.

Agradeço.

3 Respostas

acopiara

Fiz aqui um exemplo, dá uma testada aí.

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Exemplo extends JFrame {
	JLabel label;

	JTextArea texto = null;

	JPanel panel;

	public Exemplo() {
		BoxLayout layout = new BoxLayout(this.getContentPane(),
				BoxLayout.Y_AXIS);
		this.setLayout(layout);

		label = new JLabel("Teste");
		texto = new JTextArea();
		texto.addKeyListener(new KeyListener() {

			public void keyPressed(KeyEvent arg0) {
				

			}

			public void keyReleased(KeyEvent arg0) {
				String t = texto.getText();
			    int pos = texto.getCaretPosition()-1;
				if(arg0.getKeyChar()=='['){
					t= t+"]";
				texto.setText(t);
				texto.setCaretPosition(pos+1);
				}
				
			}

			public void keyTyped(KeyEvent arg0) {
				// TODO Auto-generated method stub

			}

		});
		texto.setColumns(20);
		panel = new JPanel();
		panel.add(label);
		panel.add(texto);
		this.add(panel);

		this.pack();
		this.setVisible(true);

	}

	public static void main(String args[]) {
		Exemplo exemplo = new Exemplo();
		exemplo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
T
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JanelaTexto extends JFrame {

	JTextArea texto;
	JScrollPane scroll;

	public JanelaTexto() {
		super();
		setSize(500,500);

		texto = new JTextArea();
		scroll = new JScrollPane(texto);
		getContentPane().add(scroll);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		texto.setFont(new Font("Arial", Font.BOLD, 14));


		texto.addKeyListener(new KeyAdapter() {
			public void keyReleased(KeyEvent e) {

				if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_SPACE) {
					verificar();
				}
			}

		});

		setVisible(true);
	}


	public void verificar() {
		int cursorpos = texto.getCaretPosition() - 1;

		if (cursorpos < 0) {
			return;
		}

		if (texto.getText().substring(cursorpos,cursorpos+1).equals("[")) {
			String antigo = texto.getText();
			texto.setText(antigo.substring(0,cursorpos+1) + "]" + antigo.substring(cursorpos+1,antigo.length()));
			texto.setCaretPosition(cursorpos+1);
		}

	}

	public static void main(String[] args){
		new JanelaTexto();
	}

}
F

Obrigado pessoal. Eu nem queria o código pronto, pois acho que devemos, como profissionais saber encontrar as soluções para os problemas. Mas já que veio assim, poupei um pouco de esforço.

Na minha aplicação eu usei o código do acopiara. Então, eu usei somente a funcionalidade que eu queria. Na verdade, eu utilizei somente o trecho do código que me seria útil, e criei o método que segue abaixo:

private void completaCaracterDigitado(){
        
        jTextArea_Formula.addKeyListener(new KeyListener(){
            public void keyPressed(KeyEvent evt){
                
            }
            public void keyReleased(KeyEvent evt){
                String t = jTextArea_Formula.getText();
                int pos = jTextArea_Formula.getCaretPosition()-1;
                if(evt.getKeyChar() == '['){
                    t = t + ']';
                }
                    jTextArea_Formula.setText(t);
                    jTextArea_Formula.setCaretPosition(pos+1);
                }
            public void keyTyped(KeyEvent evt){

            }
        });
        
    }

Depois chamei o este método no construtor da classe.

Obrigado!!! :D

Criado 7 de fevereiro de 2008
Ultima resposta 7 de fev. de 2008
Respostas 3
Participantes 3