E aí galera, tranquilo?
Preciso implementar um JDialog com o design pattern Singleton, porque preciso que o JDialog em questão seja instanciado apenas uma vez e essa instância esteja disponível em toda a aplicação, na verdade, eu já fiz a implementação do Singleton em outra classe e está certo, o problema/dúvida quanto a aplicar o Singleton à um JDialog é que neste eu preciso passar a ele o JFrame que será o “parent”, quero saber como fazer isso sem interferir no padrão Singleton.
Assim funciona?
public enum SingletonDialog {
INSTANCE;
private JDialog dialog;
private SingletonDialog () {
dialog = new JDialog();
}
public void show(JFrame parent) {
// clear(dialog); // limpa os campos do dialog
// dialog.pack(); // redimensiona
dialog.setLocationRelativeTo(parent);// centraliza no jframe
dialog.setVisible(true);
}
public void close() {
dialog.setVisible(false);
}
public void dispose() {
dialog.dispose();
}
}
Olá diego12,
Obrigada pela resposta. Bom, me desculpe a ignorância, mas como ficaria para instanciar nesse caso e posteriormente para usar essa única instância para tornar o JDialog visível somente quando necessário?
SingletonDialog singleton = SingletonDialog.INSTANCE;
singleton.show(jframe);
// ou
JDialog dialog = SingletonDialog.INSTANCE.getDialog();
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
É que tem duas formas de fazer Singleton em Java, essa que apresentei é a mais simples, a outra é:
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE == null ? INSTANCE = new Singleton() : INSTANCE;
}
}
diego12:
É que tem duas formas de fazer Singleton em Java, essa que apresentei é a mais simples, a outra é:
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE == null ? INSTANCE = new Singleton() : INSTANCE;
}
}
Então, atualmente faço uso desta última que você citou, neste caso como eu deveria fazer para “passar” o JFrame para o JDialog mantendo o Singleton do jeito que implementei?
Praticamente igual:
public class SingletonDialog {
private static SingletonDialog INSTANCE;
private JDialog dialog;
private SingletonDialog() {
dialog = new JDialog();
}
public static SingletonDialog getInstance() {
return INSTANCE == null ? INSTANCE = new SingletonDialog() : INSTANCE;
}
public void show(JFrame parent) {
// clear(dialog); // limpa os campos do dialog
// dialog.pack(); // redimensiona
dialog.setLocationRelativeTo(parent);// centraliza no jframe
dialog.setVisible(true);
}
public void close() {
dialog.setVisible(false);
}
public void dispose() {
dialog.dispose();
}
}
Se for um dialog próprio, faça assim que é melhor:
class MeuDialog extends JDialog {
public void show(JFrame parent) {
// clear(); // limpa os campos do dialog
// this.pack(); // redimensiona
this.setLocationRelativeTo(parent);// centraliza no jframe
this.setVisible(true);
}
public void close() {
this.setVisible(false);
}
// public void dispose() {
// super.dispose();
// }
}
depois no singleton:
public class Singleton {
private static SingletonDialog INSTANCE;
private MeuDialog dialog;
private Singleton() {
dialog = new MeuDialog();
}
public static Singleton getInstance() {
return INSTANCE == null ? INSTANCE = new Singleton() : INSTANCE;
}
public MeuDialog getDialog() { return this.dialog; }
}