Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636

    jinternalframe e jframe

    Ciao a tutti

    Io ho questa classe

    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?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: jinternalframe e jframe

    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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    Forse non mi sono spiegato bene

    Io vorrei che un file di testo per esempio venga visualizzato con jinternalframe.

    Questa classe l'ho gia fatta..tutto ok..mi visualizza il file di testo in un jinternalframe in un jdesktoppanel.

    Ora vorrei oltre a questa visualizzazzione, che lo stesso file visualizzato come jinternalframe mi venga ANCHE visualizzato in un jframe e quindi esternamente al jdesktoppanel

    si può fare?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da jurij7
    si può fare?
    Ma l'ho appena spiegato!! Facendo pure un esempio di come sia possibile creare una stessa interfaccia utente (intesa come insieme di componenti) in un JInternalFrame e in un JFrame.

    Vuoi aprire contemporaneamente la stessa interfaccia sia in un JFrame che in un JInternal? Bene, farai in un unico blocco quello che io invece ho fatto separatamente nei due listener.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    Si infatti ho visto che funziona questo ma non è esattamente quello che vorrei

    Io ho questa classe all'interno del mio package

    package miopackage;

    import javax.swing.*;

    public class InternalFrame extends JInternalFrame{

    private JScrollPane sp;
    private JTextArea ta;
    private JTextField tf;

    /** Creates a new instance of intFr */
    public IntFr() {
    sp = new JScrollPane();
    ta = new JTextArea();
    tf = new JTextField();

    setClosable(true);
    setIconifiable(true);
    setMaximizable(true);
    setResizable(true);
    setVisible(true);

    ta.setColumns(255);
    ta.setFont(new java.awt.Font("Courier", 0, 14));
    ta.setRows(5);
    sp.setViewportView(ta);
    tf.setEditable(false);
    tf.setFont(new java.awt.Font("Courier", 0, 14));

    org.jdesktop.layout.GroupLayout intfrLayout = new org.jdesktop.layout.GroupLayout(getContentPane());
    getContentPane().setLayout(intfrLayout);
    intfrLayout.setHorizontalGroup(
    intfrLayout.createParallelGroup(org.jdesktop.layou t.GroupLayout.LEADING)
    .add(tf, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 720, Short.MAX_VALUE)
    .add(sp, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 720, Short.MAX_VALUE)
    );
    intfrLayout.setVerticalGroup(
    intfrLayout.createParallelGroup(org.jdesktop.layou t.GroupLayout.LEADING)
    .add(intfrLayout.createSequentialGroup()
    .add(tf, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(org.jdesktop.layout.LayoutStyle.R ELATED)
    .add(sp, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 378, Short.MAX_VALUE))
    );
    }

    public JTextArea getTextArea(){
    return ta;
    }

    /*public JScrollPane getScrollPane(){
    return sp;
    }*/

    public JTextField getTextField(){
    return tf;
    }

    }

    Quando apro il file (selezionandolo tramite un Jfilechooser) da visualizzare all'interno vorrei che mi desse un messaggio che mi chiedesse "Vuoi visualizzare il file anche all'esterno?"

    Se clicco su "SI" il file che ho visualizzato nel jinternalframe si dovrebbe aprire anche come jframe esterno altrimenti rimane solo nel jinternalframe

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da jurij7
    Quando apro il file (selezionandolo tramite un Jfilechooser) da visualizzare all'interno vorrei che mi desse un messaggio che mi chiedesse "Vuoi visualizzare il file anche all'esterno?"
    Bene, allora usa JOptionPane e più precisamente uno dei suoi metodi statici showConfirmDialog(). Scegli quello che riceve anche un 'optionType' da mettere, nel tuo caso, a YES_NO_OPTION. Il metodo può restituire quindi YES_OPTION o NO_OPTION. A quel punto fai quello che devi fare in base alla scelta dell'utente.

    Originariamente inviato da jurij7
    Se clicco su "SI" il file che ho visualizzato nel jinternalframe si dovrebbe aprire anche come jframe esterno altrimenti rimane solo nel jinternalframe
    Sì ho capito perfettamente, fin dall'inizio. Ma la questione, e l'ho già anche spiegata, è che non puoi pensare di estendere solamente JInternalFrame (o JFrame) e sperare di poter aprire quello come interno o esterno a tuo piacimento.

    Le soluzioni sono almeno 2:

    A) Crei 2 classi diverse che estendono una JFrame e l'altra JInternalFrame. Se devono contenere un certo numero di componenti, beh, dovrai duplicare tutto!

    codice:
    public class FrameInterno extends JInternalFrame {
        private JScrollPane sp;
        private JTextArea ta;
        private JTextField tf;
    
        public FrameInterno() {
            sp = new JScrollPane();
            ta = new JTextArea();
            tf = new JTextField();
        ......
    e
    codice:
    public class FrameEsterno extends JFrame {
        private JScrollPane sp;
        private JTextArea ta;
        private JTextField tf;
    
        public FrameEsterno() {
            sp = new JScrollPane();
            ta = new JTextArea();
            tf = new JTextField();
        ......
    oppure

    B) Crei una classe che estende JPanel che contiene tutta la tua interfaccia utente e poi semplicemente la aggiungi in un JFrame e/o JInternalFrame a tuo piacimento.
    Che è poi la soluzione che ho mostrato nel mio esempio di codice iniziale.


    Ti è chiaro ora??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    Grazie Andbin ..ci sono riuscito
    Grazie ancora

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da jurij7
    ci sono riuscito
    Come? Soluzione A, B o altro?

    Ci sarebbe anche da dire un'altra cosa: vedo che nei frame devi avere una JTextArea e un JTextField. Se apri un frame interno e anche uno esterno, devono contenere gli stessi identici dati? Cioè devono essere "sincronizzati"? In tal caso potresti anche far condividere lo stesso Document. (ma ovviamente non so cosa devi fare di preciso e non so quindi se la tua è una situazione del genere)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    Solucione A

    Ho creato un'altra classe per il JFrame

    Si stessi deti cioè stesso file .txt

    No non sicnronizzati perchè il JFrame lo apro solo se accetto la condizione.

    Grazie tante...Java comincia a piacermi parecchio

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da jurij7
    No non sicnronizzati perchè il JFrame lo apro solo se accetto la condizione.
    Forse non hai letto attentamente la mia risposta di prima. Se, e ripeto se, sei nella situazione in cui devi aprire un frame interno e anche uno esterno, i dati tra i due frame devono essere "sincronizzati"?? Nel senso che se hai ad esempio un componente come una JTextArea "editabile" la modifica su una deve ripercuotersi anche su quella nell'altro frame??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.