Estou tentando colocar um JInternalFrame dentro de um JDesktopPane… mas nao ta dando mto certo… ele nao aparece qdo deveria:
importjavax.swing.*;importjavax.swing.border.Border;importjavax.swing.border.TitledBorder;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.beans.PropertyVetoException;publicclassJMenuTestextendsJFrame{protectedJMenuBarjmb=newJMenuBar();protectedJMenujm1=newJMenu("Pacientes");protectedJMenujm2=newJMenu("Funcionários");protectedJMenuItemit1=newJMenuItem("Cadastros...");protectedJMenuItemitbar=newJMenuItem();protectedJMenuItemitsair=newJMenuItem("Sair");protectedJInternalFrameiframe=newJInternalFrame("Teste",true,true,true,true);protectedActionHandlerhandler=newActionHandler();protectedJDesktopPanedesktop=newJDesktopPane();publicJMenuTest(){super("Teste Menu");}publicvoidinitProg(){setLayout(newFlowLayout());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);}privateclassActionHandlerimplementsActionListener{publicvoidactionPerformed(ActionEvente){if(e.getSource()==it1){iframe.setPreferredSize(newDimension(Toolkit.getDefaultToolkit().getScreenSize().width,Toolkit.getDefaultToolkit().getScreenSize().height));JPaneljp=newJPanel();jp.setBorder(newTitledBorder("Cadastro de Pacientes"));JTextFieldjt=newJTextField("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!
É 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:
Na sua classe principal, crie uma variável de instância:
private SuaClasseInternal iframe;
e trabalhe ela assim:
privatevoidexibirSuaClasseInternal(ActionEventevt){if(iframe==null){// inicia frame iframe=newSuaClasseInternal(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 publicvoidfecharSuaClasseInternal(ActionEventevt){// 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:
importjavax.swing.JInternalFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.border.TitledBorder;publicclassJIFextendsJInternalFrame{privateJMenuTestjmt;publicJIF(JMenuTestjmt){super("Cadastro");this.jmt=jmt;JPaneljp=newJPanel();jp.setBorder(newTitledBorder("Cadastro de Pacientes"));JLabeljl=newJLabel("Demonstração");jp.add(jl);add(jp);}}
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: