Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Problema: JFrame non carica JPanel

    Il problema, come da titolo, è:
    ho una classe TRY_JAVAgui composta da:

    - un frame (classe estesa a JFrame, in cui setto il JPanel con setContentPane(JPanel e); setto anche una classe estesa a JMenuBar)

    - un menu (classe estesa a JMenu)

    - un pannello principale, come Home

    Ora ogni volta che clicco su un pulsante della JMenuBar (quindi un JMenuItem), deve cambiarmi schermata switchando/cambiando il pannello corretto.
    Ora io non faccio altri che usare un metodo generale nella classe TRY_JAVAgui che ha come parametri solo il pannello da cambiare quindi:
    codice:
    void set_panel(JPanel panel){ 
    pannello= panel; 
    frame.setContentPane(pannello); 
    }
    Prima quando cliccavo sul JMenuItem "confronta due directory", senza commenti al codice, mi appariva la schermata di scelta del file, per il componente JFileChooser: quindi, L'ACTION EVENT è collegato, ho provato anche con delle stampe su terminale, e l'evento è collegato.

    Il problema sta nel disegnare gli oggetti del pannello. Ora con il codice commentato, quindi senza JFileChooser, la schermata rimane intatta, ho la homepage che ho caricato al momento della creazione di TRY_JAVAgui, in cui setto il JPanel.
    Posto il codice del pannello che col JFileChooser (con questo non dovrebbe fare altro che mettermi un bordo arancione e uno sfondo.. che invece non fa), se serve altro codice fatemelo sapere, GRAZIEEEE

    codice:
    import java.awt.Color;
    import java.awt.Font;
    import javax.swing.*;
    import javax.swing.border.Border;
    
    class confronta_panel extends JPanel {
     
    /*JLabel etichetta, etichetta2; 
    JButton ok; 
    JFileChooser scegli; 
    int n;*/ 
    Color sfondo; 
    Font textfont; 
    Border orangeBorder;
     
    confronta_panel(){ 
    super(); 
    
    /*etichetta=new JLabel("Directory"); 
    etichetta2=new JLabel(); 
    ok=new JButton("Avanti"); 
    scegli= new JFileChooser(); 
    n = scegli.showOpenDialog(confronta_panel.this);*/ 
    
    textfont=new Font("serif", Font.BOLD, 14); 
    sfondo=new Color(210,220,230); 
    orangeBorder = BorderFactory.createLineBorder(Color.ORANGE, 5); 
    setBorder(orangeBorder);  
    
    /*scegli.setFont(textfont); 
    etichetta.setFont(textfont); 
    etichetta2.setFont(textfont); 
    ok.setFont(textfont);*/ 
    
    setLayout(null); 
    setBackground(sfondo); 
    
    /*add(ok); 
    add(etichetta); 
    add(etichetta2); 
    add(scegli); 
    etichetta.setVisible(true); 
    etichetta2.setVisible(true); 
    scegli.setVisible(true); 
    ok.setVisible(true); 
    etichetta.setLocation(30,50); 
    etichetta2.setLocation(50,90); 
    scegli.setLocation(80,70); 
    ok.setLocation(120,120); 
    scegli.setApproveButtonText("Scegli directory"); 
    scegli.setDialogTitle("Scegli directory"); 
    if(n==JFileChooser.APPROVE_OPTION) etichetta2.setText(scegli.getSelectedFile().getName()); */

  2. #2

    Re: Problema: JFrame non carica JPanel

    Fammi capire, il tuo problema è che non ti carica il nuovo pannello?
    Se il problema è questo è presto detto: non hai rivalidato il frame.

    Non basta usare il setContentPane, ma devi anche rivalidarla la finestra.
    Fai questa prova: setta il nuovo pannello e, dopo averlo fatto, trascina una delle dimensioni della finestra (in pratica cambiagli le dimensioni col drag&drop). Dovrebbe apparire il nuovo pannello da te settato in precedenza.
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  3. #3
    Dici in pratica:

    codice:
    void set_panel(JPanel panel){ 
    pannello= panel; 
    frame.setContentPane(pannello); 
    frame.setSize(810,520); 
    }
    così non mi funziona

  4. #4
    no, le dimensioni le devi cambiare in fase d'esecuzione.

    in poche parole: ti metti col mouse sul bordo della finestra e quando diventa una manina premi e trascini la finestra...

    poi perchè fai pannello=panel??
    I miei esempi in Java qui: http://cdpjavaexamples.altervista.org/index.html

  5. #5
    Mmh no comunque non cambia, modificando la finestra come dici tu, senza codice.

    pannello=panel : potrei anche non farlo ma per chiarezza lo metto, rappresenta il pannello attuale.

    Cioè voglio dire tu come cambieresti pannello..
    hai un JFrame e due JPanel, su Internet non ho ancora trovato un articolo che lo spieghi; o almeno alcuni lo fanno male, usano un metodo per ogni JPanell e ci mettono tutti gli add().

    frame.setContentPane(JPanel) e frame.getContentPane().add(JPanel) fanno la tessa cosa?

  6. #6
    Ok ho trovato il problema ma non sono riuscito a saltarne fuori.
    In pratica mettendo
    codice:
    //frame.setContentPane(pannello);
    il frame è vuoto, ha solo il JMenuBar,e va bene: ora però quando clicco su "confronta due directory" non mi carica niente, invece ci dovrebbe essere anche il bordo arancione, se caricasse il pannello, mi sembra.

    codice:
    void set_panel(JPanel panel){ 
    pannello= panel; 
    frame.setContentPane(pannello); 
    }
    codice:
    class VocemenuListener implements ActionListener{
         
    
    @Override
    public void actionPerformed(ActionEvent e) { 
    
            switch(e.getActionCommand()){ 
                  case " Apri": break;
                  case " Salva": break;
                  case " Stampa": break;
                  case " Esci": break;
                  case " Confronta due directory": 
                                TRY_JAVAgui.frame.setContentPane(new confronta_panel());
                                break;
                  case " Confronto ricorsivo tra due directory": break;
                  case " Cerca informazioni": break;
                  case " Aggiorna due directory": break;
                  case " Informazioni": 
                                TRY_JAVAgui.frame.setContentPane(new main_panel()); 
                                break;
                  case " Documentazione: codice sorgente": break;
             } 
    } 
    }

  7. #7
    Ok sono giunto alla radice del problema:
    il problema è nel riferimento al pannello, cioè credo di far male l'inizializzazione del pannello.
    Cioè:

    codice:
    public class TRY_JAVAgui {
    
    
        static JFrame frame;    
        my_menu menu;
        JPanel pannello; //tipo base
        
    
    TRY_JAVAgui(){
        
        frame=new JFrame("Finestra");
        menu=new my_menu();
        pannello= new main_panel();
        
    
        frame.setContentPane(pannello);
    }
    }
    Ora cambiando
    codice:
    pannello= new confronta_panel();
    mi disegna correttamente solo lo sfondo con il bordo, ma se clicco su "Informazioni", portandomi giustamente al main_panel che carica correttamente,e poi di nuovo su "confronta due directory" non carica confronta_panel, perlomeno ci rimane main_panel.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Certo che ti sei proprio voluto complicare le cose. L'estensione di JMenu potevi evitarla ad esempio.


    Non va bene così?
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    
    class MainPanel extends JPanel {
      MainPanel() {
        JLabel label = new JLabel("Main Panel");
        label.setFont(new Font("Verdata",Font.BOLD,20));
        label.setBorder(BorderFactory.createLineBorder(Color.ORANGE));
        add(label);
      }
    }
    
    class Panel1 extends JPanel {
      Panel1() {
        JLabel label = new JLabel("Panel1");
        label.setFont(new Font("Verdata",Font.BOLD,20));
        label.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        add(label);
      }
    }
    
    class Panel2 extends JPanel {
      Panel2() {
        JLabel label = new JLabel("Panel2");
        label.setFont(new Font("Verdata",Font.BOLD,20));
        label.setBorder(BorderFactory.createLineBorder(Color.RED));
        add(label);
      }
    }
    
    
    class MyFrame extends JFrame {
      private JMenuItem menuHome, menuPanel1, menuPanel2;
      private MainPanel homePanel;
      private Panel1 panel1;
      private Panel2 panel2;
      
      MyFrame(String title) {
        super(title);
        
        // menu
        JMenuBar bar = new JMenuBar();
        JMenu menu = new JMenu("Primo");
        setJMenuBar(bar);
        
        menuHome   = new JMenuItem("Home");
        menuPanel1 = new JMenuItem("Panel1");
        menuPanel2 = new JMenuItem("Panel2");
        
        menuHome.addActionListener(new MyMenuListener());
        menuPanel1.addActionListener(new MyMenuListener());
        menuPanel2.addActionListener(new MyMenuListener());
        
        
        menu.add(menuHome);
        menu.add(menuPanel1);
        menu.add(menuPanel2);
        
        bar.add(menu);
        
        
        // Primo JPanel
        homePanel = new MainPanel();
        setContentPane(homePanel);
        
        panel1 = new Panel1();
        panel2 = new Panel2();
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
      
      private class MyMenuListener implements ActionListener {
        public void actionPerformed(ActionEvent ae) {
          String title = ae.getActionCommand();
          
          switch(title) {
            case "Home":
            setContentPane(homePanel);
            homePanel.revalidate();
            homePanel.repaint();
            break;
            case "Panel1":
            setContentPane(panel1);
            panel1.revalidate();
            panel2.repaint();
            break;
            case "Panel2":
            setContentPane(panel2);
            panel2.revalidate();
            panel2.repaint();
          }
        }
      }
      
      
      public static void makeGUI() {
        MyFrame mf = new MyFrame("Example");
        mf.setSize(600,500);
        mf.setVisible(true);
      }
      
      public static void main(String[] args) {
        try {
          SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
              makeGUI();
            }
          });
        } catch(Exception e) {}
      }
    }


    PS: posta il codice indentato e più leggibile per favore.

  9. #9
    Alla fine credo che nel mio codice mancassero solo
    pannello.revalidate();
    pannello.repaint();
    nel metodo set_panel(JPanel panel), ma mi sbaglio perchè non funziona ancora, eppure mi sembra uguale al tuo.

    codice:
    class main_panel extends JPanel{
            
        JTextArea area;
        Color sfondo;
        Font textfont;
        Border orangeBorder;
        Image miaimmagine;
    
        
        main_panel(){
            
            super();
            
            area=new JTextArea();
            miaimmagine=Toolkit.getDefaultToolkit().getImage("immagini/Java.gif");
            textfont=new Font("serif", Font.BOLD, 14);       
            sfondo=new Color(210,220,230);
            orangeBorder = BorderFactory.createLineBorder(Color.ORANGE, 5);    
            
            
            area.setText("testo ");
            
            setBorder(orangeBorder);
            area.setBackground(sfondo);
            area.setLocation(280, 30);
            area.setSize(400,400);
            area.setVisible(true);
            area.setFont(textfont);
            area.setLineWrap(true);
            
            setLayout(null);
            setBackground(sfondo);
            
            add(area);
             
        }
        
        @Override
        public void paintComponent(Graphics g){
                 
            super.paintComponent(g);
            g.drawImage(miaimmagine,40,50,170,310,this);
        }
    }

    codice:
    class confronta_panel extends JPanel {
         
         JLabel etichetta, etichetta2;
         JButton ok;
         Color sfondo;
         Font textfont;
         Border orangeBorder;
         
         
         confronta_panel(){
              
              super();
              
              etichetta=new JLabel("Directory");
              etichetta2=new JLabel();
              ok=new JButton("Avanti");
              textfont=new Font("serif", Font.BOLD, 14);       
              sfondo=new Color(210,220,230);
              orangeBorder = BorderFactory.createLineBorder(Color.ORANGE, 5);
                        
              etichetta.setFont(textfont);
              etichetta2.setFont(textfont);
              ok.setFont(textfont);
              
              setBackground(sfondo);
              setBorder(orangeBorder);
              setLayout(null);
              
              
              
              add(ok);
              add(etichetta);
              add(etichetta2);
              
              etichetta.setVisible(true);
              etichetta2.setVisible(true);
              ok.setVisible(true);
              
              etichetta.setLocation(30,50);
              etichetta2.setLocation(50,90);
              ok.setLocation(120,120);       
     
         }
              
    }
    CLASSE PRINCIPALE, chiama gli altri 2 pannelli
    codice:
    class vocemenu1 extends JMenu{
        
        JMenuItem apri;
        JMenuItem salva;
        JMenuItem esci;
        JMenuItem stampa;
            
        vocemenu1(String key){
             
            super(key);
    
            apri=new JMenuItem("  Apri", new ImageIcon("immagini/icon_open_folder.gif"));
            salva=new JMenuItem("  Salva", new ImageIcon("immagini/save_icon.gif"));
            stampa=new JMenuItem("  Stampa", new ImageIcon("immagini/printer-icon.png"));
            esci=new JMenuItem("  Esci", new ImageIcon("immagini/exit.png"));  
            
            add(apri);
            add(salva);
            addSeparator();
            add(stampa);
            addSeparator();
            add(esci);
            
            apri.addActionListener(new VocemenuListener());
            salva.addActionListener(new VocemenuListener());
            stampa.addActionListener(new VocemenuListener());
            esci.addActionListener(new VocemenuListener());
        }
    }
    
    class vocemenu2 extends JMenu{
        
        JMenuItem confronta1;
        JMenuItem confronta_rc;
        JMenuItem cerca;
        JMenuItem aggiorna;
        
        vocemenu2(String key){
             
            super(key);
            
            confronta1=new JMenuItem("  Confronta due directory",  new ImageIcon("immagini/iconFolder.gif"));
            confronta_rc=new JMenuItem("  Confronto ricorsivo tra due directory", new ImageIcon("immagini/iconFolder.gif"));
            cerca=new JMenuItem("  Cerca informazioni", new ImageIcon("immagini/icon-search.png"));
            aggiorna=new JMenuItem("  Aggiorna due directory", new ImageIcon("immagini/icon-refresh.gif"));  
            
            add(confronta1);
            add(confronta_rc);
            addSeparator();
            add(aggiorna);
            addSeparator();
            add(cerca);
            
            
            confronta1.addActionListener(new VocemenuListener());
            confronta_rc.addActionListener(new VocemenuListener());
            cerca.addActionListener(new VocemenuListener());
            aggiorna.addActionListener(new VocemenuListener());      
        }
    }
    
    class vocemenu3 extends JMenu{
        
        JMenuItem info;
        JMenuItem doc;
        
        vocemenu3(String key){
             
            super(key);
            
            info=new JMenuItem("  Informazioni", new ImageIcon("immagini/icon-info.png"));
            doc=new JMenuItem("  Documentazione:  codice sorgente", new ImageIcon("immagini/icon-document.gif"));
            
            add(info);
            add(doc);
            
            info.addActionListener(new VocemenuListener());
            doc.addActionListener(new VocemenuListener());      
        }
    }
    
    class my_menu extends JMenuBar{
    
        vocemenu1 one;
        vocemenu2 two;
        vocemenu3 three;
        
        my_menu(){
            
            super();
            
            one=new vocemenu1("File");
            two=new vocemenu2("Operazioni");
            three=new vocemenu3("Info");
            
            add(one);
            add(two);
            add(three);
        }
    }
    
    
    class VocemenuListener implements ActionListener{
         
    
         @Override
         public void actionPerformed(ActionEvent e) {
              
              switch(e.getActionCommand()){
                   
                   case "  Apri":                  
                           break;
                   case "  Salva":
                           break;
                   case "  Stampa":
                           break;
                   case "  Esci":
                           break;
                   case "  Confronta due directory":
                           TRY_JAVAgui.frame.setContentPane(new confronta_panel());
                           break;
                   case "  Confronto ricorsivo tra due directory":
                           break;
                   case "  Cerca informazioni":
                           break;
                   case "  Aggiorna due directory":
                           break;
                   case "  Informazioni":
                        TRY_JAVAgui.frame.setContentPane(new main_panel());
                           break;
                   case "  Documentazione: codice sorgente":
                           break;         
              }
         }  
    }
    
    class FinestraListener implements WindowListener{
    
        @Override
        public void windowOpened(WindowEvent e) {   
             System.out.println("apro");
        }
    
        @Override
        public void windowClosing(WindowEvent e) {
            //finestra per chiedere se vuoi uscire
             System.out.println("esco");
        }
    
        @Override
        public void windowClosed(WindowEvent e) {   
        }
    
        @Override
        public void windowIconified(WindowEvent e) {    
        }
    
        @Override
        public void windowDeiconified(WindowEvent e) {    
        }
    
        @Override
        public void windowActivated(WindowEvent e) {   
        }
    
        @Override
        public void windowDeactivated(WindowEvent e) {     
        }   
        
    }
    
    
    
    
    public class TRY_JAVAgui {
    
    
        static JFrame frame;    
        my_menu menu;
        JPanel pannello; //tipo base,upcast
        
    
    TRY_JAVAgui(){
        
        frame=new JFrame("Finestra");
        menu=new my_menu();
        pannello= new confronta_panel();
        
    
        frame.setContentPane(pannello);
        frame.setJMenuBar(menu);
        frame.addWindowListener(new FinestraListener());
        frame.setResizable(true);
        frame.setMinimumSize(new Dimension(820,510));
        frame.setSize(820,510);
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);
        frame.setVisible(true);
        frame.setIconImage((new ImageIcon("immagini/foldersearch.png")).getImage());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    
    }
    
    TRY_JAVAgui(String key){
        
        this();
        
        frame.setTitle(key);
    
    }
    
    void set_panel(JPanel panel){
         
         
         pannello= panel;
         frame.setContentPane(pannello);
         pannello.revalidate();
         pannello.repaint();
    }
    
        public static void main(String[] args) {
    
            TRY_JAVAgui mainWindow= new TRY_JAVAgui("titolo");
            
            
        }
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ti consiglio di guardare per bene i principi della OOP, in particolare l'incapsulamento... perchè sei molto distante dal proporre un lavoro "pure OOP".

    Il problema è che non chiami set_panel(). E poi scrivilo così:
    codice:
    void set_panel(JPanel panel){
         frame.setContentPane(panel);
         panel.revalidate();
         panel.repaint();
    }

    Comunque per risolvere il problema, o meglio per far funzionare il tutto, puoi utilizzare una chiamata a pack().
    codice:
    TRY_JAVAgui.frame.pack();
    Metti la linea all'interno dello Switch, sotto a ciascuno dei setContentPane().

    Comunque così è concettualmente "tutto" errato.

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.