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

    [JAVA] Refresh di un JFrame

    Sò che è già stato chiesto molte volte qualcosa di simile, ma non ho mai trovato esattamente quello che serve a me, e non riesco a risolvere il mio problema con gli altri topic...

    Ho un JPanel layoutato con BorderLayout.
    Alla posizione Center ho uno ScrollPane che include un JPanel. Il JPanel ha un GridLayout ed ogni riga è un JLabel.
    Alla posizione South ho una JTextField.

    La questione è: io scrivo nella JTextField, premo invio (dopo aver implementato l'ActionListener), e voglio che il mio messaggio compaia IN TEMPO REALE nell'ultima JLabel di quelle sopra descritte.

    Ho provato ad inserire nell'ActionListener il repaint di tutte e tre le componenti a cascata che sto utilizzando: JPanel con JLabel, JPanel di posizione CENTER, JFrame principale.

    Il codice non dà problemi, ma nella pratica non mi viene aggiornato il JPanel con il messaggio che voglio... Devo chiudere e riaprire il frame per vederlo... Qualche buon consiglio?

    In base a quello che ho scritto non credo sia indispensabile il codice per dare una risposta, ma metto uno stralcio:

    codice:
    public class Applicazione extends Finestra
    {
        // VARIABILI VARIE
    
        public Applicazione ()
        {
            bachecaMessaggi = new JPanel ();
            bachecaMessaggi.setLayout (new GridLayout (25, 0));
            listaM [] = new JLabel [25]
            // CARICO LE JLABEL E RIEMPIO IL VETTORE listaM
            for (int y = 0; y<listaM.length; y++)
            {
                bachecaMessaggi.add (listaM [y]);
            }
            JScrollPane centralPane = new JScrollPane (bachecaMessaggi);
            centralPanel = new JPanel ()
            info = new JTextField ("Scrivi");
            centralPanel.add (centralPane, BorderLayout.CENTER);
            centralPanel.add (info, BorderLayout.SOUTH);
            frame = new JFrame ();
            frame.getContentPane ().add (centralPanel, BorderLayout.CENTER);
    
            info.addActionListener (new ActionListener () 
            {
                public void actionPerformed (ActionEvent e) 
                {
                    if (info.getText ().equals (""))
                    {
                        // AVVISO DI ERRORE
                    }
                    
                    else
                    {
                        info.setText ("");
                        bachecaMessaggi.validate ();
                        bachecaMessaggi.repaint ();
                        centralPanel.validate ();
                        centralPanel.repaint ();
                        frame.validate ();
                        frame.repaint ();
                    }
                }
            });
        }
    }
    Date per buono che non ci siano errori di sintassi (l'ho riscritto velocemente per farvi capire), come posso ottenere il mio desiderato effetto REFRESH tramite l'ActionListener???

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    56
    in genere una bella chiamata alla .validate() al contenitore che contiene il componente da ridisegnare funziona... frame.validate() l'hai provato ?

  3. #3
    Si
    Come vedi nel codice che ho postato è nell'ActionListener

    Uso .validate() e .repaint() su tutti e tre i componenti a cascata che contengono le mie JLabel da refreshare, compreso il frame principale, ma non succede nulla

    E' importante l'ordine in cui faccio .validate() e .repaint() ?
    Dovrei fare prima .repaint() e poi .validate() ?

  4. #4
    Nessuno mi sà aiutare???

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    56
    intanto vedo una anomalia qui :

    centralPanel.add (centralPane, BorderLayout.CENTER);

    con gli scroll pane devi chiamare il metodo .setViewPortView(...) per far vedere il componente. Cmq sto provando a fare più o meno quello che hai in mente di fare e ti faccio sapere, però per fare una bacheca io utilizzerei le JList implementando per bene model e renderer ..o Jtable modificate che come righe hanno jPanel complessi.. ti consiglio di esplorare queste strade.. e di utilizzare IDE come netbeans o eclipse..

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    56
    Allora qui mi funziona e credo che più o meno è quello che volevi fare te ma ho levato un po' di passaggi secondo me ridondanti... ho creato la classetta con netbeans ma ho messo di proposito il layout generale nullo, per evitare il codice generato da netbeans (ide con cui ho creato il file ) quindi come grafica fa ribrezzo ma per farti capire come agganciare i vari pezzi . La cosa fondamentale è chiamare il .validate sulla viewport dello scroll pane... poi insomma aggiustati i layout i colori e tutto quanto ..

    Ho messo una lista lì così per bellezza, ma potrebbe esserti utile per tenere traccia qua e là.. cmq ti consiglio caldamente di fare queste cose utilizzando strumenti potenti come jtable, o jlist .. anche perché se vuoi tipo fare delle funzioni di selezione su una riga e cose del genere farle così è frustrante e non ti evolvi. Spero cmq di esserti stato utile ! Ciao ciao !! Buona programmazione


    codice:
    /*
     * Test.java
     *
     * Created on 26-nov-2011, 16.23.39
     */
    package applicationclient1;
    
    import java.awt.Color;
    import java.util.LinkedList;
    import java.util.List;
    import javax.swing.BoxLayout;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    /**
     *
     * @author Luca Coraci
     */
    public class Test extends javax.swing.JFrame {
    
        List<JLabel> list = new LinkedList<JLabel>();
        JPanel panel = new JPanel();
    
        /** Creates new form Test */
        public Test() {
            initComponents();
            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
            panel.setBackground(Color.BLUE);
            panel.setOpaque(true);
            this.jScrollPane1.setViewportView(panel);
            
        }
    
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
    
            jTextField1 = new javax.swing.JTextField();
            jLabel1 = new javax.swing.JLabel();
            jScrollPane1 = new javax.swing.JScrollPane();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            getContentPane().setLayout(null);
    
            jTextField1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jTextField1ActionPerformed(evt);
                }
            });
            getContentPane().add(jTextField1);
            jTextField1.setBounds(60, 11, 330, 20);
    
            jLabel1.setText("Scrivi: ");
            getContentPane().add(jLabel1);
            jLabel1.setBounds(10, 14, 32, 14);
    
            jScrollPane1.setBorder(javax.swing.BorderFactory.createTitledBorder("bacheca"));
            getContentPane().add(jScrollPane1);
            jScrollPane1.setBounds(0, 50, 400, 250);
    
            pack();
        }// </editor-fold>
    
        private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {
            JLabel label = new JLabel(this.jTextField1.getText());
            label.setBackground(Color.green);
            label.setOpaque(true);
            list.add(label);
            panel.add(label);
            jScrollPane1.getViewport().validate();
            
        }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                public void run() {
                    new Test().setVisible(true);
                }
            });
        }
        // Variables declaration - do not modify
        private javax.swing.JLabel jLabel1;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextField jTextField1;
        // End of variables declaration
    }

  7. #7
    Sei stato UTILISSIMO, non sò come ringraziarti; ho capito perfettamente tutto ciò che hai scritto, ed hai ragione sull'utilizzo di List... Ho solo una domanda:

    perchè implementi così il main?

    codice:
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                public void run() {
                    new Test().setVisible(true);
                }
            });
        }
    Non bastava il classico:

    public static void main (String args []) {
    new Test().setVisible(true);
    }

    ?

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    56
    Beh l'idea ben precisa non ce l'ho neanche io purtroppo , ci sarebbe da leggersi bene la documentazione. Quello che so è che le gui in java gestite con le swing girano su un singolo thread.. quella riga di codice non fa altro che mettere in coda la chiamata alla creazione del frame, più che altro per il metodo setVisible(.. ) . Per piccole applicazioni non avrai mai problemi di sorta.. ma per grosse potrebbe saltare fuori qualche problema che cmq non ho ancora ben capito di che tipo neanche io . Questo però è il modo più sicuro da quanto ne so .. e cmq è il codice che ti genera di default netbeans quando crei un jframe :P

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    56
    http://java.sun.com/products/jfc/tsc.../threads1.html

    qua c'è la documentazione ^ l'ho messa in coda di lettura pure io :P

    Ci ho campato anche io a trovare aiuto nei vari forum per anni su mille e mille problemi. è ora di aiutare gli altri

    Ciaooo

  10. #10
    Perfetto, grazie
    Sei riuscito ad essere preciso, chiaro, e risolutivo

    Problema risolto

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.