Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    JFrame dentro JTabbedPane?

    Ciao a tutti,

    cimentandomi da pochissimo con le GUI di Java, non riesco bene a capire come far funzionare una cosa.

    Ho creato inizialmente questo frame con tutta una serie di componenti:

    Codice PHP:
    import.....
    ...

    class 
    ProvaFrame extends JFrame {

       private 
    JScrollPane scrollPane;
       private 
    JTextField textfield1;
       private 
    JFormattedTextField textfield2;

       public 
    provaFrame() {
            
    super("prova");

            
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            
    setSize(800600);

            
    textfield1 = new JTextField();
            
    textfield2 = new JFormattedField();

            final 
    DefaultTableModel data = new DefaultTableModel();
            
            
    data.addColumn("Colonna1");
            
    data.addColumn("Colonna2");

            final 
    JTable table = new JTable(data);
            
    scrollPane = new JScrollPane(table);
            
            
    JButton bottone1 = new JButton("Bottone1");

            
    JPanel pannelloAlto = new JPanel(new FlowLayout(FlowLayout.LEFT));
            
    pannelloAlto.add(bottone1);

            
    JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
            
    controlPanel.add(textfield1);
            
    controlPanel.add(textfield1);

            
    getContentPane().add(pannelloAltoBorderLayout.NORTH);
            
    getContentPane().add(scrollPaneBorderLayout.CENTER);
            
    getContentPane().add(controlPanelBorderLayout.SOUTH);

    E fin qui tutto bene. Poi, però, è sopraggiunta una nuova idea: ho creato, in un file a parte una JTabbedPane con tre tab. Ciascuno di questi tre tab dovrebbe mostrare il frame di cui sopra! Ma se faccio una cosa del genere:

    Codice PHP:
    public class ProvaTab extends JFrame
    {
         public 
    ProvaTab() {
            
    super ("Prova tab");

            
    JTabbedPane tabbedPane = new JTabbedPane();

            
    ProvaFrame prova1 = new ProvaFrame();//IL FRAME DI SOPRA
            
    tabbedPane.addTab("Prova 1"prova1);
    ...
    ... 
    il compilatore, come mi aspettavo, mi ritorna questo errore:

    Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container

    Allora vi chiedo:

    1)Come faccio ad aggiungere il frame "ProvaFrame" ad un tab di JTabbedPane?
    2)Oltre a questo, cliccando su uno dei tab dichiarati, è anche possibile aggiungere una funzione del tipo "Esci dal programma" invece che solo JPanel?

    Grazie fin d'ora..

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

    Re: JFrame dentro JTabbedPane?

    Originariamente inviato da grifis78
    il compilatore, come mi aspettavo, mi ritorna questo errore:

    Exception in thread "main" java.lang.IllegalArgumentException: adding a window to a container

    1)Come faccio ad aggiungere il frame "ProvaFrame" ad un tab di JTabbedPane?
    Primo: non è un errore di "compilazione" (qui non centra il compilatore!). Questo succede a runtime e basta.

    Secondo: appunto non puoi aggiungere componenti "top-level" (finestre) dentro altri componenti "normali".
    (equivalente reale: puoi mettere un mobile dentro una casa .... non una casa dentro un mobile)

    Originariamente inviato da grifis78
    2)Oltre a questo, cliccando su uno dei tab dichiarati, è anche possibile aggiungere una funzione del tipo "Esci dal programma" invece che solo JPanel?
    Fai click su una "linguetta" e vuoi terminare il programma? E per quale motivo?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Capisco andbin. Quindi, se ho capito bene, dovrei "scomporre" ProvaFrame in modo tale da aggiungere i suoi componenti direttamente ad un JPanel all'interno del tab specifico. Giusto?

    Volevo far ciò per non riscrivere tutto, o in parte, il codice per ogni tab di JTabbedPane.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da grifis78
    Quindi, se ho capito bene, dovrei "scomporre" ProvaFrame in modo tale da aggiungere i suoi componenti direttamente ad un JPanel all'interno del tab specifico. Giusto?
    A dire il vero non ho affatto ben capito cosa stai cercando di fare ....

    Un JTabbedPane lo devi aggiungere dentro un "contenitore" (es. JPanel o content pane di un JFrame). E in un JTabbedPane puoi avere N "linguette", ognuna associata ad 1 Component che è quello mostrato per quella "pagina". Che poi il Component sia effettivamente es. un JPanel che contiene a sua volta altro .... è un altro discorso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Mi spiego meglio: dal libro sul quale sto studiando, ho preso del codice per creare un JTabbedPane. Questo, viene inserito in un Jframe. Posto il codice per intero degli esempi sul libro:

    Codice PHP:
    import java.awt.BorderLayout;
    import java.awt.Color;
    import javax.swing.JFrame;
    import javax.swing.JTabbedPane;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JButton;
    import javax.swing.SwingConstants;

    public class 
    JTabbedPaneFrame extends JFrame  
    {
       
    // set up GUI
       
    public JTabbedPaneFrame()
       {
          
    super"JTabbedPane Demo " );

          
    JTabbedPane tabbedPane = new JTabbedPane(); // create JTabbedPane 

          // set up pane11 and add it to JTabbedPane 
          
    JLabel label1 = new JLabel"panel one"SwingConstants.CENTER );
          
    JPanel panel1 = new JPanel(); // create first panel
          
    panel1.addlabel1 ); // add label to panel
          
    tabbedPane.addTab"Tab One"nullpanel1"First Panel" ); 
          
          
    // set up panel2 and add it to JTabbedPane
          
    JLabel label2 = new JLabel"panel two"SwingConstants.CENTER );
          
    JPanel panel2 = new JPanel(); // create second panel
          
    panel2.setBackgroundColor.YELLOW ); // set background to yellow
          
    panel2.addlabel2 ); // add label to panel
          
    tabbedPane.addTab"Tab Two"nullpanel2"Second Panel" ); 

          
    // set up panel3 and add it to JTabbedPane
          
    JLabel label3 = new JLabel"panel three" );
          
    JPanel panel3 = new JPanel(); // create third panel
          
    panel3.setLayout( new BorderLayout() ); // use borderlayout
          
    panel3.add( new JButton"North" ), BorderLayout.NORTH );
          
    panel3.add( new JButton"West" ), BorderLayout.WEST );
          
    panel3.add( new JButton"East" ), BorderLayout.EAST );
          
    panel3.add( new JButton"South" ), BorderLayout.SOUTH );
          
    panel3.addlabel3BorderLayout.CENTER );
          
    tabbedPane.addTab"Tab Three"nullpanel3"Third Panel" );

          
    addtabbedPane ); // add JTabbedPane to frame
       
    // end JTabbedPaneFrame constructor
    // end class JTabbedPaneFrame 
    Che poi viene utilizzato qui:

    Codice PHP:
    import javax.swing.JFrame;

    public class 
    JTabbedPaneDemo
    {
       public static 
    void mainString args[] )
       { 
          
    JTabbedPaneFrame tabbedPaneFrame = new JTabbedPaneFrame();  
          
    tabbedPaneFrame.setDefaultCloseOperationJFrame.EXIT_ON_CLOSE );
          
    tabbedPaneFrame.setSize250200 ); // set frame size
          
    tabbedPaneFrame.setVisibletrue ); // display frame
       
    // end main
    // end class JTabbedPaneDemo 
    Adesso, al posto di quei JPanel che vengono inseriti in ogni tab:
    Codice PHP:
    JPanel panel1 = new JPanel(); // create first panel
          
    panel1.addlabel1 ); // add label to panel
          
    tabbedPane.addTab"Tab One"nullpanel1"First Panel" ); 
    vorrei inserire quel "ProvaFrame" che ho postato all'inizio.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da grifis78
    Adesso, al posto di quei JPanel che vengono inseriti in ogni tab:
    vorrei inserire quel "ProvaFrame" che ho postato all'inizio.
    Ripeto che non puoi mettere un JFrame dentro altri componenti.

    Puoi fare in modo che quella tua classe estenda JPanel invece di JFrame (e chiaramente devi cambiare delle cose in quel codice). E quindi metterlo come componente del "tab".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    hmm.. Perfetto, oggi provo così e ti faccio sapere, grazie andbin!

  8. #8
    Perfetto! Anche se sto cercando adesso come impostare le dimensioni di tutto il JPanel all'interno della tab... Nella classe ProvaFrame ho impostato un setSize, ma nella tab vedo la JTable molto piccola.

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.