Duvida com JDesktopPane e JInternalFrame

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?

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:

e trabalhe ela assim:

[code]
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;
}
} [/code]

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?

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:

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?

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

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