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 ???
[quote=O2]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 ???[/quote]
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.
[quote=O2]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 ???[/quote]
Eu fiz deste jeito aqui
Criei uma classe abstrata que verifica se existe uma janela no desktopPane
[code]
/*
- 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 (dsfextreme@pop.com.br)
*/
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;
}
}[/code]
Dai eu testo no menu
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!!!
[quote=rumenigg] 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!!![/quote]
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