Duvida com JDesktopPane e JInternalFrame

6 respostas
antoniodourado

Deêm uma olhada nisso…

Estou tentando colocar um JInternalFrame dentro de um JDesktopPane… mas nao ta dando mto certo… ele nao aparece qdo deveria:

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;

public class JMenuTest extends JFrame{
	
	protected JMenuBar jmb = new JMenuBar();
	protected JMenu jm1 = new JMenu("Pacientes");
	protected JMenu jm2 = new JMenu("Funcionários");
	protected JMenuItem it1 = new JMenuItem("Cadastros...");
	protected JMenuItem itbar = new JMenuItem();
	protected JMenuItem itsair = new JMenuItem("Sair");
	protected JInternalFrame iframe = new JInternalFrame("Teste",true,true,true,true);
	protected ActionHandler handler = new ActionHandler();
	protected JDesktopPane desktop = new JDesktopPane();
	
	public JMenuTest(){
		super("Teste Menu");
	}
	
	public void initProg(){
		
		setLayout(new FlowLayout());
	
		it1.addActionListener(handler);
		itsair.addActionListener(handler);
		
		jm1.setSize(90, 100);
		jm2.setSize(90, 100);
		jm1.add(it1);
		jm1.add(itbar);
		jm1.add(itsair);
		jmb.add(jm1);
		jmb.add(jm2);
		jmb.setBorderPainted(true);
		this.setJMenuBar(jmb);
			
		desktop.setVisible(true);
		getContentPane().add(desktop);
		
	}
	
	private class ActionHandler implements ActionListener{
	
		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == it1){
				iframe.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize().width,Toolkit.getDefaultToolkit().getScreenSize().height));
				JPanel jp = new JPanel();
				jp.setBorder( new TitledBorder("Cadastro de Pacientes"));
				
					
				JTextField jt = new JTextField("Teste");
				jp.add(jt);
				
				
				iframe.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
				iframe.add(jp);
				
				desktop.add(iframe);
				
			}
			if(e.getSource() == itsair){
				dispose();
			}
		}
		
	}
	

}

A outra classe que contém o main está tudo correto!

Alguém poderia me ajudar?

6 Respostas

Ironlynx
desktop.setVisible(true);   
        getContentPane().add(desktop);
É isso mesmo q eu tô vendo, vc tá dando um setVisible direto no desktop, e antes dele ir para o ContentPane e não na sua classe q extende o jframe??? E a sua internal frame não será um outro item de consulta,cadastro ou algo assim?É bem melhor deixar ela com uma referência a sua classeprincipal, assim:
SuaClasseInternal extends JInternalFrame{
                                          JMenuTest jmt;
                                          public SuaClasseInternal(JMenuTest jmt){
                                              super("Minha classe");
                                               this.jmt=jmt
                                               //iniciarComponentes e blablabal
                                          }
                                        }
Na sua classe principal, crie uma variável de instância:
private SuaClasseInternal iframe;
e trabalhe ela assim:
private void exibirSuaClasseInternal (ActionEvent evt) { 
      if (iframe== null) { 
         // inicia frame 
         iframe= new SuaClasseInternal (this); 
         // adiciona o frame no DesktopPane 
         desktop.add(iframe); 
      } 
      // Exibe o frame 
      iframe.setVisible(true); 
   }  
   
   // este método está declarado como público para poder ser executado por outra classe 
   public void fecharSuaClasseInternal (ActionEvent evt) { 
      // verifica se há uma referencia válida para o objeto 
      if (iframe!= null) { 
         // libera o objeto 
         iframe.dispose(); 
         iframe= null; 
      } 
   }
antoniodourado

Cara, ainda não deu certo… veja novamente o q eu fiz…

Criei uma classe separada:

import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

public class JIF extends JInternalFrame{
	
	private JMenuTest jmt;
	
	public JIF(JMenuTest jmt){
		
		super("Cadastro");
		
		this.jmt = jmt;
		
		JPanel jp = new JPanel();
		jp.setBorder( new TitledBorder("Cadastro de Pacientes"));
		
		JLabel jl = new JLabel("Demonstração");
		jp.add(jl);
		
		add(jp);
	}

}

e a principal ficou da seguinte forma:

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JMenuTest extends JFrame{
	
	protected JMenuBar jmb = new JMenuBar();
	protected JMenu jm1 = new JMenu("Pacientes");
	protected JMenu jm2 = new JMenu("Funcionários");
	protected JMenu jm12 = new JMenu("Cadastros");
	protected JMenuItem it1 = new JMenuItem("Cadastro...");
	protected JMenuItem itbar = new JMenuItem();
	protected JMenuItem itsair = new JMenuItem("Sair");
	protected JIF iframe = new JIF(this);
	protected ActionHandler handler = new ActionHandler();
	protected JDesktopPane desktop = new JDesktopPane();
	
	public JMenuTest(){
		super("Teste Menu");
	}
	
	public void initProg(){
		
		//setLayout(new FlowLayout());
			
		it1.addActionListener(handler);
		itsair.addActionListener(handler);
		
		jm1.setSize(90, 100);
		jm2.setSize(90, 100);
		jm1.add(jm12);
		jm12.add(it1);
		jm1.add(itbar);
		jm1.add(itsair);
		jmb.add(jm1);
		jmb.add(jm2);
		jmb.setBorderPainted(true);
		setJMenuBar(jmb);
		
		add(desktop);
	}
	
	private class ActionHandler implements ActionListener{
	
		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == it1){
				iframe.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize().width,Toolkit.getDefaultToolkit().getScreenSize().height));					
				iframe.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
							
				desktop.add(iframe);
				
				iframe.setVisible(true);
				
			}
			if(e.getSource() == itsair){
				dispose();
			}
		}		
	}
}

Nota: isso é apenas um teste… estou instanciando a classe JIF junto com a classe só para fins de teste.

Alguma ideia do meu erro?

Ironlynx

Antonio, vamos lá…
Dê um tamanho a sua classe em initProg(), exemplo:

//...blablabka
 setJMenuBar(jmb);             
        add(desktop);        
        setSize(640,480);   
        setVisible(true);

Nada de iframe.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); , é só por em JIF um setClosable, por exemplo:

public JIF(JMenuTest jmt){ super("Cadastro"); this.jmt = jmt; JPanel jp = new JPanel(); jp.setBorder( new TitledBorder("Cadastro de Pacientes")); JLabel jl = new JLabel("Demonstração"); jp.add(jl); getContentPane().add(jp); setClosable(true); setSize(600,400); }
e no sua classe tratadora(a handler) não se esqueça de um setOpaque:

public void actionPerformed(ActionEvent e) { if(e.getSource()==it1){ iframe.setOpaque(true); desktop.add(iframe); iframe.setVisible(true); }else if(e.getSource()==itsair){ iframe.dispose(); } }

Testa ai… :wink:

Gobain

Aproveitando o tópico vai aí uma dúvida de iniciante:

  • Aquele método de setSelected(boolean) de um InternalFrame define qual IFrame aberta ficará no topo?
Ironlynx

Não entendi “no topo”.Se vc quis dizer com foco, a resposta é sim. :wink:

Gobain

Isso isso isso.
Aquela q estará em interação com o usuário!

Criado 28 de outubro de 2007
Ultima resposta 29 de out. de 2007
Respostas 6
Participantes 3