Putz!!!
Gent ta dificil faze o meu Jinternalframe abrir só uma vez já usei variavel
para dizer quando ele já foi aberto mas não adianta.
Alguem ai sabe??? como ???
Abrir só um vez o JInternalframe
13 Respostas
Putz!!!
Gent ta dificil faze o meu Jinternalframe abrir só uma vez já usei variavel
para dizer quando ele já foi aberto mas não adianta.
Alguem ai sabe??? como ???
Use um design pattern chamado Singleton.
Abaixo segue um exemplo…Um abraço
public class Singleton {
private static Singleton singleton = new Singleton();
/** A private Constructor prevents any other class from instantiating. */
private Singleton() {
}
/** Static ‘instance’ method */
public static Singleton getInstance() {
return singleton;
}
// other methods protected by singleton-ness would be here…
/** A simple demo method */
public String demoMethod() {
return “demo”;
}
}
Entendeu :?:
Amigo, eu estou com o mesmo problema, e eu n entendi muito bem o exemplo. Você poderia me explicar um pouco.
Pra contestualizar, eu estou desenvolvendo um softwre p controle de rebanho bovino, e tenho um JInternalFrame p controle de funcionários, FuncionarioJIF.
Como eu poderia fazer isso.
Tenho que usar o Singletron no meu JInternalFrame, ou na classe principal, que instancia o JInternalFrame?
Obrigado!!!
Olá !
Vc tem que usar na classe que instancia o seu internalFrame.
por exemplo:
[b]
JinternalFrame seuframe = null;
public JInternalFrame seuFrame(){
if seuframe.equals(null) {
seuFrame = newJInternalFrame() ;
}else{
return seuFrame;
}
}[/b]
ou algo parecido…fiz um método que busca todos os InternalFrames dentro do DeskTopPpane tbm…vou achar aqui e coloco o exemplo tbm.
Putz!!!!! Gent ta dificil faze o meu Jinternalframe abrir só uma vez já usei variavel para dizer quando ele já foi aberto mas não adianta. Alguem ai sabe??? como ???
Eu fiz deste jeito aqui
Criei uma classe abstrata que verifica se existe uma janela no desktopPane
/*
* VerificaFrame.java
*
* Created on 7 de Maio de 2006, 10:39
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package controle;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
/**
* Esta é uma classe que irá verificar se existe frame no Desktop
* @author ([email removido])
*/
public abstract class VerificaFrame {
/** Creates a new instance of VerificaFrame */
public VerificaFrame() {
}
public static Boolean verificaFrame(JDesktopPane jDesktopPane,JInternalFrame frame) {
Boolean valor = false;
JInternalFrame[] results;
results = jDesktopPane.getAllFrames();
for (int i = 0 ; i < results.length ; i++){
if( results[i].equals(frame) ){
valor = true;
break;
}
}
return valor;
}
}
private void jMenuItemCalculoCPPActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemCalculoCPPActionPerformed
if ( ! VerificaFrame.verificaFrame(jDesktopPane1,getCalculoCPP())){
jDesktopPane1.add(getCalculoCPP());
calculoCPP.setVisible(true);
} else {
try{
calculoCPP.setSelected(true);
}
catch(Exception e){
calculoCPP.dispose();
}
}
}//GEN-LAST:event_jMenuItemCalculoCPPActionPerformed
T+ !
Olá amigo, me desculpa, mas eu não estou conseguindo fazer o JInternalFrame abrir só uma vez.
Implementei o seu exemplo, de VerificaFrame, mas abre vários a medida que clico no botão.
O que esse método getCalculoCpp() implementa?
Eu estou passando como parâmetro o desktopPane e o internalFrame instanciado.
Obrigado!!!
Olá amigo, me desculpa, mas eu não estou conseguindo fazer o JInternalFrame abrir só uma vez.
Implementei o seu exemplo, de VerificaFrame, mas abre vários a medida que clico no botão.
O que esse método getCalculoCpp() implementa?
Eu estou passando como parâmetro o desktopPane e o internalFrame instanciado.
Obrigado!!!
Cara é o seguinte.
O getCalculoCpp() retorna um InternalFrame.
Você tem que passar como parametro a janela que vc vai verificar se está aberta no DesktopPane.
Vc não viu a assinatura do método?
public static Boolean verificaFrame(JDesktopPane jDesktopPane,JInternalFrame frame)
Você passa o DesktopPane e o InternalFrame
:arrow:
if ( ! VerificaFrame.verificaFrame(jDesktopPane1,getSeuInternalFrame())){
jDesktopPane1.add(getSeuInternalFrame());
SeuInternalFrame().setVisible(true);
} else {
try{
SeuInternalFrame().setSelected(true);
}
catch(Exception e){
SeuInternalFrame().dispose();
}
}
Qualquer coisa, coloca ai sua dúvida
Sigleton brother......
/**
* @return Returns the calculoCPP.
*/
public CalculoCPP getCalculoCPP() {
if(calculoCPP==null){
calculoCPP = new CalculoCPP(getValores());
}
return calculoCPP;
}
tentei apagar mas nao sei como faz. 
abaixo a “resposta” corrigida
e ae galera…
Penso que a solução mais interessante seria usar patterns, afinal são modelos testados e que funcionam.
Porém, não estou conseguindo implementar o Singleton.
da o seguinte erro :
Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException at org.netbeans.lib.awtextra.AbsoluteLayout.addLayoutComponent(Unknown Source)
codigo frame interno :
private static JIFrame frame = null;
public synchronized static JIFrame getJIFrame() {
if (frame == null){
frame = new JIFPacientes();
}
return frame;
}
========================
chamada no frame principal - DesktopFrame :
desktopPrincipal.add(JIFrame.getJIFrame());
JIFrame.getJIFrame().setVisible(true);
alguém poderiame ajudar ?
correção:
JIFPacientes > JIFrame
olá amigo eu faço assim:
//declaro uma referecia
private meuFrame frame
//depois aonde chamo frame faço
public void actionPerformed...{
//se ele não foi criado
if( frame == null ){
frame = new frame();
desktop.add( frame );
frame.setVisible( true );
}else{//se ele estiver criado
if( frame.isVisible() ){
frame.pack();//volta frame
}else{
desktop.add( frame );//adicona frame ao JDesktopPane
frame.setVisible( true );
}
}
}
ate
Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:
Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:
//ADICIONA TELAS (JInternalFrame) AO JDesktopPane
// usado assim: this.addTelaDesk(new TelaFuncionarios(null));
public void addTelaDesk(JInternalFrame tela){
for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
// se uma janela semelhante estiver aberta
if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
"Janela duplicada",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
opções,
opções[0]
);
// se utilizar a aberta retorna e não abre outra,
// caso contrário sai do for e abre outra igual
if(qst == 0){
return;
}else if(qst == 1){
break;
}
}
}
this.telaDesktop.add(tela); //adiciona na tela
tela.setVisible(true); // seta visivel
this.cascade(); //coloca em cascata para deixar "pratico"
}
A função para colocar em cascata:
private void cascade() {
JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
int separation = 25; // distancia entre as janelas
// Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
int i = desk.getAllFrames().length; // quantidade de frames
for (JInternalFrame f : desk.getAllFrames()) {
f.setLocation(i*separation, i*separation);
i--; //mutiplicador
}
}
Exemplos de como chamar depois:
this.addTelaDesk(new TelaFuncionarios(null));
String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));
Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!
Abraços
Precisava ressuscitar 3 tópicos antigos para dizer isso?
É né, achei que poderia ajudar mais…
sou novo no forum, da próxima posto em mais de um só se for recente…
abs