Originariamente inviato da jurij7
public class IntFrame extends JInternalFrame la quale mi apre un frame interno ad un jdesktoppane.
E' possibile tramite questa stessa classe aprire lo stesso frame ma esterno con condizione ?
Cioè...vorrei cmq che il jnternalframe venisse aperto nel jdesktoppane ma vorrei che lo stesso frame fosse visualizzato all'esterno del jdesktoppane.
Vorrei anche che quando deve aprire il jframe esterno mi chiedesse tramite un joptionpane se voglio aprire il jframe oppure no..ma cmq il jinternalframe si dovrebbe aprire senza condizione.
E' possibile farlo e sopratutto nella stessa classe?
Andiamo un po' in ordine e con calma. Innanzitutto JFrame e JInternalFrame non sono intercambiabili. Un JFrame non può stare in un JDesktopPane e un JInternalFrame non è un contenitore "top-level" e quindi non può aprirsi come finestra a sé stante.
Questo in sostanza vuol dire che non puoi pensare di estendere solo uno oppure solo l'altro sperando poi di poterlo aprire come interno oppure esterno a seconda di qualche condizione.
C'è però una cosa che puoi fare. Racchiudere tutti i componenti all'interno di un JPanel. Quando devi visualizzare un frame interno crei un JInternalFrame e gli aggiungi quel panel, quando devi visualizzare un frame esterno crei un JFrame e gli aggiungi quel panel. In pratica fai un pannello che si può inserire facilmente in uno o l'altro.
Ecco un semplice esempio:
codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestFrame extends JFrame
{
private JButton buttonInt;
private JDesktopPane desktopPane;
private JButton buttonExt;
public TestFrame ()
{
super ("Test Frame Interno/Esterno");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setSize (500, 400);
buttonInt = new JButton ("Interno");
desktopPane = new JDesktopPane ();
buttonExt = new JButton ("Esterno");
Container contentPane = getContentPane ();
contentPane.add (buttonInt, BorderLayout.NORTH);
contentPane.add (desktopPane, BorderLayout.CENTER);
contentPane.add (buttonExt, BorderLayout.SOUTH);
buttonInt.addActionListener (new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
JInternalFrame ifr = new JInternalFrame ("Interno", true, true, true);
ifr.getContentPane ().add (new MyPanel ());
ifr.pack ();
ifr.setVisible (true);
desktopPane.add (ifr);
}
});
buttonExt.addActionListener (new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
JFrame f = new JFrame ("Esterno");
f.getContentPane ().add (new MyPanel ());
f.pack ();
f.setVisible (true);
}
});
}
public static void main (String[] args)
{
SwingUtilities.invokeLater (new Runnable ()
{
public void run ()
{
TestFrame f = new TestFrame ();
f.setVisible (true);
}
});
}
}
class MyPanel extends JPanel
{
public MyPanel ()
{
super (new BorderLayout ());
add (new JLabel ("Label numero 1"), BorderLayout.NORTH);
add (new JLabel ("Label numero 2"), BorderLayout.CENTER);
}
}
Come si può vedere, i due ActionListener sono molto molto simili. Cambia solo la istanziazione di JInternalFrame oppure JFrame e il fatto che il JInternalFrame va aggiunto nel JDesktopPane.
Per il resto tutta la interfaccia (il MyPanel nell'esempio) viene semplicemente messa in uno o l'altro.