Eu crio duas telas iguais, essas telas possuem dois JTexts e um botão. Eu digito uma frase em um dos JText e ao apertar o botão essa frase aparece no outro JText. O que eu quero saber é como ao digitar o texto em uma das telas e apertar o botão a mudança de texto aconteça nas duas telas.
Se são instancias diferentes, verifica se dentro da tela tem algum objeto em comum e que já esteja instanciado.
Em tese, uma tela pode ser instanciada quantas vezes se deseja e de acordo com a memoria, é pra ser independente uma da outra.
crie um método na segunda tela
quando vc alterar a primeita tela execute o método da segunda tela.
public void mudacampo(String s) {
CampoTela2.settext(s);
}
nao sei para que vc vai usar isso nem em que situação… mas talve z isso resolva
Existem N formas de implementar isso.
Eu sugiro criar uma classe que controla a replicação do texto de um componente para os outros.
Suponha que você tenha uma tela com um JTextField:
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class MinhaJanela extends JFrame {
// JTextField da minha janela
private JTextField textField;
public MinhaJanela() {
super("Janela");
textField = new JTextField();
textField.setPreferredSize(new Dimension(200, 36));
Container container = getContentPane();
container.setLayout(new FlowLayout(FlowLayout.CENTER));
container.add(textField);
Dimension size = new Dimension(240, 100);
setSize(size);
setMinimumSize(size);
}
// Método que permite obter o JTextField da minha janela
public JTextField getTextField() {
return textField;
}
}
E você quer abrir várias dessas telas e sempre replicar o que é digitado em um JTextField para o JTextField das outras telas.
Pois bem, você pode criar uma classe responsável por tratar essa replicação de texto:
import java.util.LinkedList;
import java.util.List;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
public class TextReplicator {
private class Listener implements DocumentListener {
final JTextComponent source;
Listener(JTextComponent source) {
this.source = source;
}
@Override
public void changedUpdate(DocumentEvent e) {
notifyChanges(source);
}
@Override
public void insertUpdate(DocumentEvent e) {
notifyChanges(source);
}
@Override
public void removeUpdate(DocumentEvent e) {
notifyChanges(source);
}
};
private List<JTextComponent> components = new LinkedList<>();
private boolean notifying;
public void add(JTextComponent component) {
components.add(component);
DocumentListener listener = new Listener(component);
Document document = component.getDocument();
document.addDocumentListener(listener);
}
private void notifyChanges(JTextComponent source) {
if (!notifying) {
try {
notifying = true;
String text = source.getText();
for (JTextComponent target : components) {
if (target != source) {
target.setText(text);
}
}
} finally {
notifying = false;
}
}
}
}
E agora é só você registrar os JTextField das instâncias de suas telas em um objeto do tipo TextReplicator:
import javax.swing.WindowConstants;
public class Programa {
public static void main(String[] args) {
Programa programa = new Programa();
programa.executar();
}
public void executar() {
MinhaJanela janela1 = new MinhaJanela();
MinhaJanela janela2 = new MinhaJanela();
MinhaJanela janela3 = new MinhaJanela();
janela1.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
janela2.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
janela3.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
janela1.setLocation(50, 200);
janela2.setLocation(340, 200);
janela3.setLocation(630, 200);
janela1.setVisible(true);
janela2.setVisible(true);
janela3.setVisible(true);
// registrar os JTextFields da minhas janelas no mesmo objeto do tipo TextReplicator
TextReplicator replicator = new TextReplicator();
replicator.add(janela1.getTextField());
replicator.add(janela2.getTextField());
replicator.add(janela3.getTextField());
}
}