Sobrescrever o metodo getText()

Galera,

Queria sobrescrever o metodo getText() do JTextComponent para dar um personalizada na hora de receber os dados.

Exemplo mais funcional do que quero:

Apenas isso, se alguem tiver alguma outra sugestao, eh bem vindo também.

Fiz isso já:

public class Teste extends JTextComponent {

    private JTextField jtf;

    public Teste(JTextField jtf) {
        this.jtf = jtf;
    }

    @Override
    public String getText() {

        Document doc = getDocument();
        String txt;

        try {
            txt = doc.getText(0, doc.getLength());
        } catch (BadLocationException ex) {
            txt = null;
        }

        if (txt.isEmpty()){
            return null;
        } else {
            return txt;
        }
    }

    public String getTextIfNotNull() {

        return jtf.?????  // Como vou dizer ao JTF que ele deve usar o gettext desta classe e nao o seu (do objeto jtf)?
    }
}

Grato a quem ajudar.

se a instância de "return jtf. " for Teste ele executará a sobrescrita por conta da anotação @Override.

voce testou e não funcionou??!

Um exemplo da sobreescrita. Note que não é para derivar uma classe de JTextComponent a menos que você saiba o que está fazendo.

package guj;

import javax.swing.JTextField;
import javax.swing.text.Document;

public class MeuJTextField extends JTextField {
	public MeuJTextField() {
	}
	public MeuJTextField(String text) {
		super(text);
	}
	public MeuJTextField(int columns) {
		super(columns);
	}
	public MeuJTextField(String text, int columns) {
		super(text, columns);
	}
	public MeuJTextField(Document doc, String text, int columns) {
		super(doc, text, columns);
	}
	/**
	 * Este é o método que você queria sobreescrever, fazendo com que ele
	 * retorne null se a entrada estiver vazia.
	 */
	@Override
	public String getText() {
		if (super.getText().isEmpty())
			return null;
		return super.getText();
	}
}

Exemplo de uso.

package guj;

import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class ExemploOverrideGetText extends JFrame {
	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JTextField txtExemplo = null;
	private JLabel lblResultado = null;
	private JButton btnTestar = null;
	private JTextField getTxtExemplo() {
		if (txtExemplo == null) {
			txtExemplo = new MeuJTextField();
			txtExemplo.setColumns(20);
			txtExemplo.setPreferredSize(new Dimension (100, 20));
		}
		return txtExemplo;
	}
	private JButton getBtnTestar() {
		if (btnTestar == null) {
			btnTestar = new JButton();
			btnTestar.setText("Checar o estado do JTextField");
			btnTestar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					lblResultado.setText ("O JTextField = " + txtExemplo.getText());
				}
			});
		}
		return btnTestar;
	}
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				ExemploOverrideGetText thisClass = new ExemploOverrideGetText();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}
	public ExemploOverrideGetText() {
		super();
		initialize();
	}
	private void initialize() {
		this.setSize(300, 100);
		this.setContentPane(getJContentPane());
		this.setTitle("Teste JTextField");
	}
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			lblResultado = new JLabel();
			lblResultado.setText("");
			jContentPane = new JPanel();
			jContentPane.setLayout(new BoxLayout(getJContentPane(), BoxLayout.Y_AXIS));
			jContentPane.add(getTxtExemplo(), null);
			jContentPane.add(lblResultado, null);
			jContentPane.add(getBtnTestar(), null);
		}
		return jContentPane;
	}
}


Agora compreendi!

então! so que assim eu teria que “criar” o meu JtextField e a minha JtextArea certo?

nao haveria um forma de eu fazer isso meio genérico, como demonstrei acima?

na verdade, não há uma forma de fazer com o código que eu postei acima funcione?

valew!

Você quer fazer uma coisa que no Ruby se chama “monkey patching” ou “duck punching”, ou seja, mudar o comportamento de classes que já existem sem criar classes derivadas a partir delas.


Isso não existe em Java, pronto. Quer coisa parecida com isso? Mude de linguagem.
De qualquer maneira, monkey patching é uma prática não muito recomendável se você não souber o que está fazendo:

(OK, talvez exista uma forma de fazer algo parecido com isso com AOP, mas deixo a explicação completa sobre se isso é ou não possível aos especialistas em AOP. Acredito que isso seja difícil ou impossível, já que as classes JTextField, JTextArea etc. são carregadas pelo classloader default, e AOP usualmente requer um classloader especializado ou então a modificação dos bytecodes das suas classes. Mas eu não sou especialista em AOP.)

Perfeito cara!

na verdade, já até fiz oq queria… mas sua explicação foi mto boa.

Agradeço pela atenção e auxilio!

A propósito, resolvi implementando os meus proprios TF e TA (como no código postado por vc)… Tronou-se mais fácil e viável nas condições atuais!

valew!