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)?
}
}
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;
}
}
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.)