Vamos lá…
Veja se isso te ajuda:
import javax.swing.JInternalFrame;
import java.awt.event.*;
import java.awt.*;
public class InternalFrameUm extends JInternalFrame {
public InternalFrameUm() {
super("Internal Frame Um",
true, //resizable
true, //closable
true, //maximizable
true);//iconifiable
setBackground(Color.GREEN);
setSize(300,300);
}
}
import javax.swing.JInternalFrame;
import java.awt.event.*;
import java.awt.*;
public class InternalFrameDois extends JInternalFrame {
public InternalFrameDois() {
super("Internal Frame Um",
true, //resizable
true, //closable
true, //maximizable
true);//iconifiable
setBackground(Color.YELLOW);
setSize(300,300);
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Principal extends JFrame{
private JDesktopPane desktopPane;
private JMenuItem menuItem1, menuItem2;
private JMenuBar menuBar;
private JMenu menu;
private InternalFrameUm frameUm;
private InternalFrameDois frameDois;
public Principal(){
super("Exemplo de JDesktopPane");
int inset = 50;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(inset, inset,
screenSize.width - inset*2,
screenSize.height - inset*2);
desktopPane = new JDesktopPane();
menuItem1 = new JMenuItem("InternalFrameUm");
menuItem1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(frameUm == null){
frameUm = new InternalFrameUm();
frameUm.setVisible(true);
desktopPane.add(frameUm);
}
else if(!frameUm.isVisible()){
frameUm.setVisible(true);
desktopPane.add(frameUm);
}
}
});
menuItem2 = new JMenuItem("InternalFrameDois");
menuItem2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(frameDois == null){
frameDois = new InternalFrameDois();
frameDois.setVisible(true);
desktopPane.add(frameDois);
}
else if(!frameDois.isVisible()){
frameDois.setVisible(true);
desktopPane.add(frameDois);
}
}
});
menuBar = new JMenuBar();
menu = new JMenu("Opções");
setContentPane(desktopPane);
menu.add(menuItem1);
menu.add(menuItem2);
menuBar.add(menu);
setJMenuBar(menuBar);
setVisible(true);
setResizable(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]){
Principal p = new Principal();
}
}
dê uma olhada aqui também…
É só substituir os noms pelos que você precisa!
[]'s :thumbup:
Se eu entendi, você quer que sempre haja somente uma única JInternalFrame… tente isso:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Principal extends JFrame{
private JDesktopPane desktopPane;
private JMenuItem menuItem1, menuItem2;
private JMenuBar menuBar;
private JMenu menu;
private JInternalFrame frame;
public Principal(){
super("Exemplo de JDesktopPane");
int inset = 50;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(inset, inset,
screenSize.width - inset*2,
screenSize.height - inset*2);
desktopPane = new JDesktopPane();
menuItem1 = new JMenuItem("InternalFrameUm");
menuItem1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(frame != null)
frame.dispose();
frame = new InternalFrameUm();
frame.setVisible(true);
desktopPane.add(frame);
}
});
menuItem2 = new JMenuItem("InternalFrameDois");
menuItem2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if(frame != null)
frame.dispose();
frame = new InternalFrameDois();
frame.setVisible(true);
desktopPane.add(frame);
}
});
menuBar = new JMenuBar();
menu = new JMenu("Opções");
setContentPane(desktopPane);
menu.add(menuItem1);
menu.add(menuItem2);
menuBar.add(menu);
setJMenuBar(menuBar);
setVisible(true);
setResizable(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]){
Principal p = new Principal();
}
}
Galera… qualquer correção/melhoria, por favor, sintam-se à vontade para críticas construtivas
[]'s :thumbup:
hehehehe… é que fiz assim só pra mostrar a idéia.
pra resolver isso, você pode fazer com que sua JFrame implemente ActionListener, e no método actionPerformed(ActionEvent evt) você identifica qual item de menu foi clicado, e faz a devida chamada à InternalFrame correspondente.
Ou melhor ainda… você pode deixar uma outra classe responsável por fazer essas chamadas… você pode criar uma classe “Observadora”, que implementaria ActionListener… aí você passaria uma referencia dela como listener dos eventos dos componentes.
A idéia é essa… se tiver dúvidas de como fazer isso, dá um toque
[]'s
é isso aí!!
precisando é só dar um toque.
[]'s :thumbup:
Pessoal, pra não complicar muito tentando explicar o meu problema, vou pedir um exemplo.
Um JFrame chamado Principal, com um jDesktopPane e um JMenuBar com dois jMenuItem’s.
O jMenuItem1 tem um evento que chama o JIF1 para jDesktopPane;
O jMenuItem2 tem um evento que chama o JIF2 para jDesktopPane;
Em classes separadas do JFrame
Um jInternalFrame chamado de JIF1;
Um jInternalFrame chamado de JIF2;
Resumindo a ação:
Quando clicar no jMenuItem1, ele irá chamar o jInternalFrame1 (JIF1) para o jDesktopPane.
Quando clicar no jMenuItem2, ele irá chamar o jInternalFrame2 (JIF2) para o jDesktopPane.
Por favor galera, ajudem aí, eu andei procurando por alguns fóruns, inclusive no fórum do GUJ e vi que tem muita gente com dúvida em relação a isso.
E desde já, agradeço pela colaboração de todos…[/b]
Luiz, muito obrigado por sua ajuda.
É mais ou menos assim:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;
public class index extends Applet implements ActionListener {
private static final long serialVersionUID = 1L;
private JMenuBar jMenuBar = null;
private JMenu jMenu = null;
private JMenu jMenu1 = null;
private JMenuItem jMenuItem = null;
private JMenuItem jMenuItem1 = null;
private JDesktopPane jDesktopPane = null;
public index() {
super();
}
public void init() {
this.setName("Nascente");
this.setSize(new Dimension(990, 592));
this.setLocation(new Point(0, 0));
this.add(getJMenuBar(), null);
this.add(getJDesktopPane(), null);
}
private JMenuBar getJMenuBar() {
if (jMenuBar == null) {
jMenuBar = new JMenuBar();
jMenuBar.setPreferredSize(new Dimension(980, 25));
jMenuBar.setBackground(SystemColor.controlHighlight);
jMenuBar.add(getJMenu());
}
return jMenuBar;
}
private JMenu getJMenu() {
if (jMenu == null) {
jMenu = new JMenu();
jMenu.setText("Cadastro");
jMenu.setMnemonic('c');
jMenu.add(getJMenu1());
}
return jMenu;
}
private JMenu getJMenu1() {
if (jMenu1 == null) {
jMenu1 = new JMenu();
jMenu1.setText("Cliente/Fornecedor");
jMenu1.setMnemonic(KeyEvent.VK_Q);
jMenu1.add(getJMenuItem());
jMenu1.add(getJMenuItem1());
}
return jMenu1;
}
private JMenuItem getJMenuItem() {
if (jMenuItem == null) {
jMenuItem = new JMenuItem();
jMenuItem.setText("Relação");
jMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
Event.CTRL_MASK, true));
jMenuItem.addActionListener(this);
}
return jMenuItem;
}
private JMenuItem getJMenuItem1() {
if (jMenuItem1 == null) {
jMenuItem1 = new JMenuItem();
jMenuItem1.setText("Tipo");
jMenuItem1.addActionListener(this);
}
return jMenuItem1;
}
private JDesktopPane getJDesktopPane() {
if (jDesktopPane == null) {
jDesktopPane = new JDesktopPane();
jDesktopPane.setPreferredSize(new Dimension(980, 555));
jDesktopPane.setAlignmentX(0.5F);
jDesktopPane.setAlignmentY(0.5F);
jDesktopPane.setBackground(new Color(205, 217, 221));
}
return jDesktopPane;
}
public void actionPerformed(ActionEvent e) {
if ( e.getSource() == jMenuItem1 ) {
InternalFrameUm jif1 = new InternalFrameUm();
jDesktopPane.add(jif1);
jif1.setVisible(true);
jif1.show();
jif1.enable(true);
}
else if (e.getSource() == jMenuItem2) {
InternalFrameDois jif2 = new InternalFrameDois();
jDesktopPane.add(jif2);
jif2.setVisible(true);
jif2.show();
jif2.enable(true);
}
}
Só que como eu tenho vários jInternalFrame’s, eu queria saber se há como criar apenas um único internalframe para abrir todos os internalframe’s através do primeiro internalframe, entendeu ?
Tipo assim, criar um jInternalFrame chamado IFPrincipal e todos os meus outros internalframe’s serão abertos atrabés do IFPrincipal.
Para quem usa eclipse, fica aparecendo o InternalFrameUm e o InternalFrameDois por causa do InternalFrameXX jif2 = new InternalFrameXX();
Imagine eu fazer isso para todos os 63 internalframe’s… vai ficar aparecendo todos eles na hora que eu abrir a aplicação (utilizo o Visual Editor).
Luiz, obrigado.
Vou fazer um teste, qualquer coisa eu posto aqui…
[quote=Luiz_Gustavo]Se eu entendi, você quer que sempre haja somente uma única JInternalFrame… tente isso:
...
[/quote]
Mas dessa forma os anonnymous inner class ficarão aparecendo… quando eu compilar, ele vai gerar o Principal$1.class e o Principal$2.class … um para cada ITEM.addActionListener… e como eu tenho mais de 50 arquivos classes.
Principal$1.class … Principal$49.class…
Você sabe como resolver isso ?
[quote=Luiz_Gustavo]
…
[]'s[/quote]
Fiz assim:
import cadastro.*; // Onde está armazenado meus jInternalFrame
....
public class index extends JFrame implements ActionListener {
...
private JInternalFrame frame;
jMenuItem.addActionListener(this);
...
public void actionPerformed(ActionEvent e) {
// Se o jMenuItem for precionado, então ele abre o jInternalFrame cfRel do pacote cadastro.
if (e.getSource() == jMenuItem) {
frame = new cfRel();
frame.setVisible(true);
jDesktopPane.add(frame);
}
else if (e.getSource() == jMenuItem1) {
frame = new cfTip();
frame.setVisible(true);
jDesktopPane.add(frame);
}
..........
Obrigado Luiz.