Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [Swing] Domande varie

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    150

    [Swing] Domande varie

    Devo creare una GUI per una chat.
    Mi servono alcuni consigli.

    1) Come posso inserire un immagine come background al mio frame? Vorrei inserire sullo sfondo un immagine fatta magari con photoshop ma non riesco ad inserirla.

    2) dovendo organizzare il mio frame in varie aree ( ovvero una per un label testo, una per un label utenti (dove andranno inseriti i vari utenti onlie..a proposito che componente usereste qui?) e una per un label avatar piu nick name), dovrei creare solo un component (con frame.getContentPane) e poi aggiungerci questi 3 JLabel/JPanel?

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

    Re: [Swing] Domande varie

    Originariamente inviato da Skaffa
    1) Come posso inserire un immagine come background al mio frame? Vorrei inserire sullo sfondo un immagine fatta magari con photoshop ma non riesco ad inserirla.
    Non esiste una "proprietà" (in nessun componente) per mettere una immagine di "sfondo". Devi fare tu del custom painting, ad esempio estendere JPanel e fare l'override di paintComponent() in modo appropriato per disegnare la immagine.
    Vedi un esempio tra i miei Java Examples, sezione Graphics.

    Originariamente inviato da Skaffa
    2) dovendo organizzare il mio frame in varie aree ( ovvero una per un label testo, una per un label utenti (dove andranno inseriti i vari utenti onlie..a proposito che componente usereste qui?) e una per un label avatar piu nick name), dovrei creare solo un component (con frame.getContentPane) e poi aggiungerci questi 3 JLabel/JPanel?
    Non è questione di componente ... è questione di "layout". E qui devi scegliere tu quale layout manager (o più) usare.
    Devi pensare come "inscatolare" componenti dentro altri componenti. Un pannello può avere un layout manager, che dispone dei componenti, che possono essere altri pannelli con un altro layout manager, ecc...
    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
    Mar 2007
    Messaggi
    150
    Per l'immagine ho risolto in questo modo:

    Codice PHP:
     ImageIcon immagine=new ImageIcon("images/logoini.gif");
            
    JLabel defaultLabel = new JLabel(immagine);
            
    defaultLabel.setOpaque(false);
          
            
    defaultLabel.setPreferredSize(new Dimension (300,450));
            
    frame.getContentPane().add(defaultLabelBorderLayout.CENTER); 
    L'immagine viene visualizzata e non ho dovuto fare grossi cambiamenti.

    Una domanda ancora sui componenti: ora io ho il mio sfondo principale del frame che e' un JLabel.
    Sopra a questo "strato" posso creare altri JPanel o JLabel a mio piacimento vero?
    L'importante e' che stiano ad un livello zOrder superiore (detta in poche parole, bastano che stiano "sopra" al JLabel di fondo).
    Giusto?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Skaffa
    L'immagine viene visualizzata e non ho dovuto fare grossi cambiamenti.
    Non lo metto in dubbio ma .... allora dovevi essere più preciso. Se avessi chiesto come visualizzare, in un qualunque modo più semplice possibile, una immagine, ti avrei subito risposto di caricare la immagine come ImageIcon e di metterla in un JLabel (un ImageIcon o più in generale un Icon si può usare con svariati altri componenti Swing).
    Ma tu parlavi di "sfondo"..... allora dovevi chiarire sfondo ... rispetto a cosa ....

    Originariamente inviato da Skaffa
    Una domanda ancora sui componenti: ora io ho il mio sfondo principale del frame che e' un JLabel.
    Sopra a questo "strato" posso creare altri JPanel o JLabel a mio piacimento vero?
    È questo a cui mi riferivo io. Generalmente JPanel è il più appropriato (e logico) per contenere componenti. Ma JPanel non ha nulla a che fare con gli Icon. Ecco perché tipicamente si estende JPanel e si fa del "custom" painting in paintComponent(). Quindi lo sfondo è disegnato da te ma JPanel ovviamente può contenere N componenti eventualmente gestiti dal layout manager impostato sul JPanel.

    Originariamente inviato da Skaffa
    L'importante e' che stiano ad un livello zOrder superiore (detta in poche parole, bastano che stiano "sopra" al JLabel di fondo).
    La questione dello z-order non è così banale. 1 Container in generale può contenere N Component. Tra questi componenti esiste una relazione per lo z-order ma generalmente l'ordine dipende dalla sequenza di inserimento nel contenitore. Esiste anche un componente particolare JLayeredPane, che gestisce appropriatamente la "stratificazione" di N componenti.

    Ma ti ripeto: non andare ad incasinarti con queste cose. Estendi JPanel e disegna ..... cosa che tra l'altro ti permetterebbe anche di fare il "tiling", ripetere più volte la immagine se necessario (e uno dei miei esempi lo mostra).
    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
    Mar 2007
    Messaggi
    150
    A questo punto vorrei chiederti come posso estendere il JPanel senza modificare praticamente tutto il mio codice?

    Ho visto mille esempi (tra cui i tuoi) pero' quando devo fare qualcosa di piu' complicato vado un po' in panne per ora.

    Il codice, a grandi linee, e' il seguente:



    Codice PHP:

    public class Esempio  {
        private static 
    void createAndShowGUI () {
            
                  
            
    //creo il frame e inizializzo i primi settaggi
            
    JFrame frame = new JFrame ("Prova");
            
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

            
    // visualizza il logo di Licha nel frame
            
    frame.setIconImage(getFDImage());

            
    // Aggiungo la barra dei menu
            
    JMenuBar menuLicha = new JMenuBar();
            
    menuLicha.setOpaque(true);
            
    menuLicha.setBackground(new Color (204,204255));

                
    // File Menu, F - mnemonic
                
    JMenu fileMenu = new JMenu ("File");
                
    fileMenu.setMnemonic (KeyEvent.VK_F);
                
    menuLicha.add (fileMenu);

                
    // File -> New, N - Mnemonic
                
    JMenuItem newMenuItem = new JMenuItem ("New"KeyEvent.VK_N);
                
    newMenuItem.addActionListener(menuListener);
                
    fileMenu.add (newMenuItem);

                
    // File -> Open, O - Mnemonic
                
    JMenuItem openMenuItem = new JMenuItem ("Open"KeyEvent.VK_O);
                
    //openMenuItem.addActionListener(menuListener);
                
    fileMenu.add(openMenuItem);

           


            
    // creo un label da inserire nel content pane
            
    JLabel defaultLabel = new JLabel("");
            
    defaultLabel.setOpaque(true);
            
    defaultLabel.setBackground(new Color (204,204255));
            
    defaultLabel.setPreferredSize(new Dimension (300,450));
            
    frame.getContentPane().add(defaultLabelBorderLayout.CENTER);

            
    // ---------------------------------------------------//




            // visualizza il frame
            
    frame.pack();
            
    frame.setVisible(true);
               
        }
        
        protected static 
    Image getFDImage() {
            
    java.net.URL imgURL LiCha.class.getResource("images/logoini.gif");
            if (
    imgURL != null) {
                return new 
    ImageIcon(imgURL).getImage();
            } else {
                return 
    null;
            }
        }

        public static 
    void main(String[] args) {
            
    //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            
    javax.swing.SwingUtilities.invokeLater(new Runnable() {

                public 
    void run() {
                    
    createAndShowGUI();
                }
            });
        }



    In questa classe ci aggiungero' i vari listener per i vari pulsanti dei menu.
    Come faccio a estendere quindi JPanel?
    Potreste darmi il "via" con una preimpostazione breve del codice?

    Ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    150
    Allora, vorrei essere piu chiaro.

    1) riguardo a quanto domando sopra, e' una buona idea procedere nel seguente modo, ovvero per ogni pannello che si aggiunge al frame principale(o meglio, per ogni blocco di pannelli), creare una nuova classe.
    Io vorrei creare 3 macro-pannelli sul mio frame principale, quindi vorrei procedere nel seguente modo:

    Codice PHP:

                  

            MyPanel1 panel1 
    = new MyPanel1 ();
            
    frame.getContentPane().add(panelBorderLayout.NORTH);
            
            
    MyPanel2 panel2 = new MyPanel2 ();
            
    frame.getContentPane().add(panelBorderLayout.CENTER);

            
    MyPanel3 panel3 = new MyPanel3 ();
            
    frame.getContentPane().add(panelBorderLayout.SOUTH); 
    E per ogni pannello creo la mia classe personalizzata di MyPanel (anche per tenere un certo ordine nel codice) come ad es:

    Codice PHP:


    public class MyPanel1 extends JPanel {

        protected static final 
    String textFieldString "JTextField";
        protected static final 
    String buttonString "JButton";
        
        protected 
    JLabel var;
        
        public 
    MyPanel1() {
            
       
    //pannello da creare
            
        
    }




    Potrebbe funzionare, ma soprattutto, e' un buon modo di procedere?

    2)
    Altra cosa: sfondo e pannelli.
    Allora, io ho il seguente frame attualmente:



    Al momento, ho erroneamente inserito lo sfondo del frame nel seguente modo:

    Codice PHP:
    ImageIcon immagine=new ImageIcon("images/green.jpg");
            
    JLabel defaultLabel = new JLabel(immagine);
            
    defaultLabel.setOpaque(true);
            
    defaultLabel.setPreferredSize(new Dimension (300,450));

            
             
    //bottone di esempio
             
    JButton button = new JButton ("Ciao");
            



            
    frame.getContentPane().add(defaultLabelBorderLayout.CENTER);
            
    frame.getContentPane().add(buttonBorderLayout.NORTH); 
    Ovvero ho inserito lo sfondo in un layout di tipo BorderLayout come fosse un componente qualsiasi.
    Ho inserito il JButton per vedere appunto che il bottone non viene messo "sopra" lo sfondo , ma come da codice, viene messo semplicemente sotto.
    Ora la mia domanda e': come faccio a lasciare fisso lo sfondo, e a inserire sopra i miei componenti (i miei 3 panel di cui parlavo sopra).
    Tra i vari pannelli dovro' usare un layout manager ovviamente, ma per inserirli sopra senza far sparire lo sfondo come posso fare?

    Vi ringrazio per l'aiuto che mi avete dato fin ora.
    ciao

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.