Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    4

    [JAVA] Aggiungere una JLabel su un JFrame a runtime

    Sto cercando di creare un progetto dove al click di una voce di un menù mi si visualizzi una JLabel nel mio JFrame.
    Il problema è che non visualizzo la mia JLabel finchè non ridimensiono il mio JFrame (a mano).
    Ho provato ad usare:
    mio_JFrame.repaint();
    Ma il risultato non cambia.

    *******************

    package provajlabel;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;

    public class ProvaJLabel {


    public static void main(String[] args) {
    final JFrame f = new JFrame("Rubrica");
    f.setSize(400, 400);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JMenuBar mb = new JMenuBar(); //creo la menu bar
    JMenu m = new JMenu("Contatti"); //creo la voce contatti
    JMenuItem mi1 = new JMenuItem("Aggiungi"); //creo le varie voci del menu contatti

    class Listener implements ActionListener{
    JMenuItem mi;
    public Listener(JMenuItem mi1){
    mi = mi1;
    }
    @Override
    public void actionPerformed(ActionEvent e){
    JMenuItem source = (JMenuItem) e.getSource();
    if (source.equals(mi)){
    f.getContentPane().setBackground(Color.red);
    JLabel label = new JLabel();
    label.setText("PIPPO");
    f.add(label);
    f.repaint();
    }
    }
    }
    Listener listener = new Listener(mi1);
    mi1.addActionListener(listener);
    m.add(mi1);
    mb.add(m);
    f.setJMenuBar(mb);
    f.setVisible(true);

    }
    }
    ********************[CODE]

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

    Re: [JAVA] Aggiungere una JLabel su un JFrame a runtime

    Originariamente inviato da PRGJava
    Il problema è che non visualizzo la mia JLabel finchè non ridimensiono il mio JFrame (a mano).
    Tu fai:
    f.add(label);

    che tecnicamente fa un add sul content-pane. Il content-pane di JFrame ha per default un BorderLayout. Usare add senza constraints (vincoli) con BorderLayout, fa aggiungere nella parte CENTER (che è 1 sola e può mostrare solo 1 componente).

    Se un contenitore (es. content-pane) ha un layout manager e tu fai modifiche al layout del contenitore (es. aggiungi/rimuovi componenti) dopo che è già visibile, devi far rivalidare il layout. Questo si fa in genere con un validate() sul contenitore (perlomeno con i layout manager più semplici).
    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
    Aug 2013
    Messaggi
    4
    Grazie per la risposta repentina,

    ho modificato il codice e ora funziona però mi solleva delle eccezioni nelle classi awt native, per esempio:
    ***************
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding container's parent to itself
    at java.awt.Container.checkAddToSelf(Container.java:4 72)
    at java.awt.Container.addImpl(Container.java:1083)
    at java.awt.Container.add(Container.java:998)
    [...]
    ****************
    codice:
    package provajlabel;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class ProvaJLabel {
    
        
        public static void main(String[] args) {
             final JFrame f = new JFrame("Rubrica");
             f.setSize(400, 400);   
             f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             
             JMenuBar mb = new JMenuBar();  //creo la menu bar         
             JMenu m = new JMenu("Contatti");    //creo la voce contatti         
             JMenuItem mi1 = new JMenuItem("Aggiungi");  //creo le varie voci del menu contatti
             
             class Listener implements ActionListener{
                JMenuItem mi;
                public Listener(JMenuItem mi1){
                     mi = mi1;
                }
                @Override
                public void actionPerformed(ActionEvent e){
                     JMenuItem source = (JMenuItem) e.getSource();
                     if (source.equals(mi)){
                         JButton btn = new JButton("CLICK");
                         JLabel lbl = new JLabel();
                         lbl.setText("CIAO");
                         Container scatola = f.getContentPane();
                         FlowLayout flow = new FlowLayout();
                         scatola.setLayout(flow);
                         scatola.add(lbl);
                         scatola.add(btn);
                         scatola.validate();
                         f.add(scatola);
                         
                         
                     }
                }
             }
             Listener listener = new Listener(mi1);
             mi1.addActionListener(listener);        
             m.add(mi1);   
             mb.add(m);         
             f.setJMenuBar(mb);
             f.setVisible(true);
             
        }
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da PRGJava
    codice:
                         Container scatola = f.getContentPane();
                         FlowLayout flow = new FlowLayout();
                         scatola.setLayout(flow);
                         scatola.add(lbl);
                         scatola.add(btn);
                         scatola.validate();
                         f.add(scatola);
    Nota bene: scatola è il content-pane e scatola lo aggiungi al frame (che internamente lo aggiunge al content-pane).
    Detto in altre parole: cerchi di aggiungere il content-pane dentro sé stesso .... ovviamente non ha senso. Se vuoi un contenitore generico, usa JPanel.


    P.S. ti segnalo alcune cose, anche se posso sembrarti "pignolo" (sì ... sono pignolo ).

    1) per il listener stai usando una "local inner class". Nulla di sbagliato ma le local inner class sono talmente particolari che le ho viste raramente. Puoi usare una anonymous inner class.
    E in ogni caso faresti meglio a fare una classe che estende JFrame, avresti più libertà e semplicità con i componenti.

    2) anche se usi una local inner class, non serve avere il costruttore: il JMenuItem mi1 lo puoi far "vedere" nel actionPerformed semplicemente dichiarando mi1 "final" (è una regoletta che dovresti sapere).
    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.