Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 41
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    Qualche consiglio sulla grafica

    Ciao,
    devo implementare il mio primo programma con interfaccia grafica e purtroppo non ho tempo di andare a studiarmi per bene tutto quello che serve, perciò ho creato tramite NetBeans la prima finestra del programma, anche se sono consapevole che forse non è il modo migliore per farlo. In effetti ha generato un mucchio di codice che fatico a comprendere. So a grandi linee come funziona ma in effetti nemmeno sul mio libro si parla di interfacce grafiche e anche le lezioni sono state scarne per non dire nulle a riguardo.
    Vorrei qualche consiglio su come proseguire.
    Come posso fare in modo che i pulsanti creati al click facciano qualcosa?
    Vi posto il codice fatto finora:

    codice:
    public class StartPanel extends JFrame {
        /**
         * Creates new form StartPanel
         */
        public StartPanel() {
            initComponents();
        }
    
        /**
         * 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">//GEN-BEGIN:initComponents
        private void initComponents() {
    
            pulsanteTavoli = new JButton();
            pulsantePrenotazioni = new JButton();
            pulsanteImpostazioni = new JButton();
            pulsanteUscita = new JButton();
            jLabel1 = new JLabel();
    
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setTitle("Table Manager");
            setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            setForeground(UIManager.getDefaults().getColor("EditorPane.background"));
            setName("startPanel"); // NOI18N
            setResizable(false);
    
            pulsanteTavoli.setFont(new Font("DejaVu Sans", 1, 15)); // NOI18N
            pulsanteTavoli.setText("Tavoli");
    
            pulsantePrenotazioni.setFont(new Font("DejaVu Sans", 1, 15)); // NOI18N
            pulsantePrenotazioni.setText("Prenotazioni");
    
            pulsanteImpostazioni.setFont(new Font("DejaVu Sans", 1, 15)); // NOI18N
            pulsanteImpostazioni.setText("Impostazioni");
    
            pulsanteUscita.setFont(new Font("DejaVu Sans", 1, 15)); // NOI18N
            pulsanteUscita.setText("Uscita");
    
            jLabel1.setFont(new Font("DejaVu Sans", 2, 18)); // NOI18N
            jLabel1.setText("Benvenuti in Table Manager");
    
            GroupLayout layout = new GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap(80, Short.MAX_VALUE)
                    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                        .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                            .addComponent(jLabel1, GroupLayout.PREFERRED_SIZE, 291, GroupLayout.PREFERRED_SIZE)
                            .addGap(41, 41, 41))
                        .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.CENTER)
                                .addComponent(pulsanteUscita, GroupLayout.PREFERRED_SIZE, 142, GroupLayout.PREFERRED_SIZE)
                                .addComponent(pulsanteTavoli, GroupLayout.PREFERRED_SIZE, 142, GroupLayout.PREFERRED_SIZE)
                                .addComponent(pulsanteImpostazioni, GroupLayout.PREFERRED_SIZE, 142, GroupLayout.PREFERRED_SIZE)
                                .addComponent(pulsantePrenotazioni, GroupLayout.PREFERRED_SIZE, 142, GroupLayout.PREFERRED_SIZE))
                            .addGap(130, 130, 130))))
            );
    
            layout.linkSize(SwingConstants.HORIZONTAL, new Component[] {pulsanteImpostazioni, pulsantePrenotazioni, pulsanteTavoli, pulsanteUscita});
    
            layout.setVerticalGroup(
                layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jLabel1, GroupLayout.PREFERRED_SIZE, 45, GroupLayout.PREFERRED_SIZE)
                    .addGap(37, 37, 37)
                    .addComponent(pulsanteTavoli, GroupLayout.PREFERRED_SIZE, 44, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(pulsanteImpostazioni, GroupLayout.PREFERRED_SIZE, 44, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(pulsantePrenotazioni, GroupLayout.PREFERRED_SIZE, 44, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(pulsanteUscita, GroupLayout.PREFERRED_SIZE, 44, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(54, Short.MAX_VALUE))
            );
    
            layout.linkSize(SwingConstants.VERTICAL, new Component[] {pulsanteImpostazioni, pulsantePrenotazioni, pulsanteTavoli, pulsanteUscita});
    
            pack();
            setLocationRelativeTo(null);
        }// </editor-fold>//GEN-END:initComponents
    
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            /* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
             */
            try {
                for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(StartPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(StartPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(StartPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(StartPanel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
            //</editor-fold>
    
            /* Create and display the form */
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new StartPanel().setVisible(true);
                }
            });
        }
        // Variables declaration - do not modify//GEN-BEGIN:variables
        private JLabel jLabel1;
        private JButton pulsanteImpostazioni;
        private JButton pulsantePrenotazioni;
        private JButton pulsanteTavoli;
        private JButton pulsanteUscita;
        // End of variables declaration//GEN-END:variables
    }
    Quel layout.setHorizontalGroup a cosa serve e perché ha una marea di parametri fra parentesi?
    I blocchi try a cosa servono?
    Parto dalla cosa più semplice: come posso fare in modo che premendo il pulsante Uscita si esca dall'applicazione? So che bisogna usare gli actionListener, ma devo fare una classe per ogni bottone??
    Infine non capisco proprio perché la dichiarazione delle variabili dei pulsanti sono messe alla fine del codice ma sono in realtà già utilizzate prima.
    Scusate le domande imbarazzanti ma io davvero devo proprio togliermi questo esame dalle scatole, non miro a diventare un programmatore java coi fiocchi
    Eventualmente mi sapete suggerire una guida molto semplice e pratica?

    Grazie mille.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Ciao,
    Come posso fare in modo che i pulsanti creati al click facciano qualcosa?
    Devi settare un ActionListener sul JButton. Quindi
    codice:
    bottone.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ae) {
        // Azione
      }
    });
    puoi anche implementare l'interfaccia ActionListener e definire il metodo actionPerformed() come definisci gli altri metodi.


    Quel layout.setHorizontalGroup a cosa serve e perché ha una marea di parametri fra parentesi?
    In realtà riceve un solo parametro: http://docs.oracle.com/javase/7/docs...ayout.Group%29

    I blocchi try a cosa servono?
    Guardati l'articolo: http://solopc.forumcommunity.net/?t=41082646

    Parto dalla cosa più semplice: come posso fare in modo che premendo il pulsante Uscita si esca dall'applicazione? So che bisogna usare gli actionListener, ma devo fare una classe per ogni bottone??
    Puoi scegliere alcune strade differenti, sopra te le ho già accennate.
    O implementi ActionListener e definisci quindi il metodo, oppure fai ciò che ho fatto li sopra per ogni bottone.

    Se implementi ActionListener, puoi sapere quale bottone ha generato l'evento in base al testo che c'è su di esso o in base al bottone stesso.
    codice:
    class MiaClasse implements ActionListener {
      private JButton btn1, btn2;
    
      MiaClasse() {
        btn1 = new JButton("Bottone 1");
        btn2 = new JButton("Bottone 2");
    
        JPanel panel = new JPanel();
        panel.add(btn1);
        panel.add(btn2);
        add(panel);
    
        btn1.addActionListener(this);
        btn2.addActionListener(this);
    
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
    
      public void actionPerformed(ActionEvent ae) {
        JButton btn = (JButton) ae.getSource();
        if(btn == btn1) {
          // pressione bottone 1
        } else {
          // pressione bottone 2
        }
      }
    }
    Non l'ho compilato, ma non credo ci siano errori. Consultando l'API trovi anche l'altro metodo per il testo.


    Infine non capisco proprio perché la dichiarazione delle variabili dei pulsanti sono messe alla fine del codice ma sono in realtà già utilizzate prima.
    Il perchè viene fatto non lo so, ma è l'IDE a farlo. Io però le dichiaro sempre all'inizio del codice, prima del costruttore. Se vuoi apprendere decentemente Java/la programmazione, ti conviene evitare l'IDE però.

    Scusate le domande imbarazzanti ma io davvero devo proprio togliermi questo esame dalle scatole, non miro a diventare un programmatore java coi fiocchi
    Eventualmente mi sapete suggerire una guida molto semplice e pratica?

    Grazie mille.
    L'unica è il reference ufficiali, non ce ne sono altre (trovi ancora il vecchio libro Java 5 di De Sio comunque).

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ciao, intanto grazie per la risposta
    Vado per gradi.

    1) Allora per implementare il pulsnate uscita ho fatto così:
    codice:
            pulsanteUscita.addActionListener(new ActionListener() {
                public void actionPerformed (ActionEvent e){
                    System.exit(0);
                }
            });
    Tenendo presente che è ancora una cosa temporanea.
    Non avevo però mai visto un modo di dichiarare un metodo come parametro.. come si chiama questa cosa? Si usa solo per questo genere di esigenze di grafica?

    2) Blocchi try: so a cosa servono mi chiedevo però in particolare cosa gestiscono quelli che NB ha messo automaticamente e se sono tutti necessari. L'assenza di Nimbus?

    3) So che usare NB non è il massimo ma credimi finora sono andata avanti con jEdit, è in pratica la prima volta che provo a usare NB. Ma mi sembra che per creare oggetti gui sia la strada più veloce.

    4) Gli altri pulsanti dovranno richiamare altre maschere/classi. Come faccio a dirgli che alla pressione di Impostazioni mi deve aprire la relativa classe che gestirà questa parte del programma? Nel frattempo che l'utente ha avviato un'altra maschera, questa (che sarà la principale) conviene solo toglierla come visibilità o terminarla?

    Grazie!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Avrei un'altra curiosità...non vedo da nessuna parte in quel codice l'oggetto JFrame finestra che dovrebbe contenere il tutto (bottoni e container)...why? Come faccio a gestire la finestra nella sua interezza (es. nel caso devo toglierla dalla visibilità) in questo caso?

    Grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Ok mi rispondo da sola, nel caso sia utile anche per qualcun altro. Alla domanda 1) la risposta è che quel tipo di notazione tratta di una classe interna anonima. Mentre alla domanda sul JFrame ho capito che in pratica l'oggetto JFrame è creato nella classe stessa che eredita da JFrame con questa istruzione qua:

    new StartPanel().setVisible(true);

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Ciao, intanto grazie per la risposta
    Vado per gradi.

    1) Allora per implementare il pulsnate uscita ho fatto così:
    codice:
            pulsanteUscita.addActionListener(new ActionListener() {
                public void actionPerformed (ActionEvent e){
                    System.exit(0);
                }
            });
    Tenendo presente che è ancora una cosa temporanea.
    Non avevo però mai visto un modo di dichiarare un metodo come parametro.. come si chiama questa cosa? Si usa solo per questo genere di esigenze di grafica?
    Non è una dichiarazione come parametro, è una classe anonima. Sto in pratica istanziando la classe ActionListener (infatti chiamo il costruttore), quindi apro la graffa e dichiaro al suo interno il metodo (o per meglio dire, ne dò una definizione).

    2) Blocchi try: so a cosa servono mi chiedevo però in particolare cosa gestiscono quelli che NB ha messo automaticamente e se sono tutti necessari. L'assenza di Nimbus?
    Ogni clausola catch() viene chiamata in caso si verificasse quella particolare eccezione. Anche se non è raro specificare un eccezione generica che le raggruppi tutte. Non che sia propriamente corretto comunque.

    3) So che usare NB non è il massimo ma credimi finora sono andata avanti con jEdit, è in pratica la prima volta che provo a usare NB. Ma mi sembra che per creare oggetti gui sia la strada più veloce.
    Se l'interesse è solo quello di imparare Java la strada migliore è Notepad++ ed un libro o comunque il reference ufficiale. Se poi hai problemi legati al tempo, è un altro discorso.


    4) Gli altri pulsanti dovranno richiamare altre maschere/classi. Come faccio a dirgli che alla pressione di Impostazioni mi deve aprire la relativa classe che gestirà questa parte del programma? Nel frattempo che l'utente ha avviato un'altra maschera, questa (che sarà la principale) conviene solo toglierla come visibilità o terminarla?

    Grazie!
    Al momento del click richiamerai ad esempio un metodo incaricato della creazione dell'oggetto Impostazioni e ne mostrerai la finestra.
    L'attuale la devi solo nascondere, se non vuoi renderla visibile (setVisible(false)). In questo modo puoi anche riprendere la finestra precedente. Guarda come vengono ad esempio create qui: http://solopc.forumcommunity.net/?t=49777313


    Avrei un'altra curiosità...non vedo da nessuna parte in quel codice l'oggetto JFrame finestra che dovrebbe contenere il tutto (bottoni e container)...why? Come faccio a gestire la finestra nella sua interezza (es. nel caso devo toglierla dalla visibilità) in questo caso?
    Non viene istanziato direttamente perchè viene già esteso. Quindi all'interno di quella classe (StartPanel) puoi direttamente chiamare setVisible(). Se lo richiami facendo new StartPanel().setVisible(true) crei un altra istanza della classe.

    Estendere un JFrame o un JPanel per personalizzarlo è molto comune.


    PS: scusa se non ho potuto rispondere prima.

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da Patrick Jane Visualizza il messaggio
    Sto in pratica istanziando la classe ActionListener (infatti chiamo il costruttore), quindi apro la graffa e dichiaro al suo interno il metodo (o per meglio dire, ne dò una definizione).
    No!
    ActionListener è un'interfaccia e come tale non può essere istanziata. Quello che stai facendo con quella notazione è creare al volo una classe che implementa ActionListener.
    Ultima modifica di Alex'87; 15-11-2013 a 18:14
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Si scusa, mi sono espresso in modo sbagliato Alex.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da Patrick Jane Visualizza il messaggio
    Non è una dichiarazione come parametro, è una classe anonima. Sto in pratica istanziando la classe ActionListener (infatti chiamo il costruttore), quindi apro la graffa e dichiaro al suo interno il metodo (o per meglio dire, ne dò una definizione).
    Al momento del click richiamerai ad esempio un metodo incaricato della creazione dell'oggetto Impostazioni e ne mostrerai la finestra.
    L'attuale la devi solo nascondere, se non vuoi renderla visibile (setVisible(false)). In questo modo puoi anche riprendere la finestra precedente. Guarda come vengono ad esempio create qui: http://solopc.forumcommunity.net/?t=49777313
    Sì in effetti vorrei che uscendo o cliccando sulla x mi tornasse alla finestra principale.
    Ho fatto così per richiamare la finestra delle impostazioni:

    codice:
            pulsanteImpostazioni.addActionListener(new ActionListener() {
                public void actionPerformed (ActionEvent e) {
                    new Settings().setVisible(true);
                }
            });
    E funziona, ma ovviamente se clicco x si chiude tutto. Ma questo poi vedo.
    C'e' una cosa che mi perplime: in NetBeans mentre creo le finestre col designer nella preview le vedo in un modo diverso da come poi sono effettivamente quando eseguo il file.
    Che casino



    PS: scusa se non ho potuto rispondere prima.

    Ma non c'è bisogno di scusarsi figurati, anzi grazie infinite per l'aiuto che mi stai dando.
    Ultima modifica di Jamie04; 15-11-2013 a 19:35

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Sì in effetti vorrei che uscendo o cliccando sulla x mi tornasse alla finestra principale.
    Ho fatto così per richiamare la finestra delle impostazioni:

    codice:
            pulsanteImpostazioni.addActionListener(new ActionListener() {
                public void actionPerformed (ActionEvent e) {
                    new Settings().setVisible(true);
                }
            });
    E funziona, ma ovviamente se clicco x si chiude tutto. Ma questo poi vedo.
    La domanda che mi preme ora è: perché queste due finestre hanno una grafica differente?
    Preciso che Settings (impostazioni) contiene dei JTabbedPane, mentre StartPanel no e StartPanel ricalca la grafica delle finestre del sistema operativo dove lo eseguo, mentre Settings no!
    Io voglio fare in modo che tutte le finestre del mio programma ricalchino la grafica standard del SO in cui viene eseguito, dove devo agire per questo?
    Che casino
    Dovresti postare il codice completo, così vedo anche l'altra classe.

    Per quanto riguarda il codice che hai mostrato qui sopra, dovrai passare a Settings un istanza della classe StartPanel; in questo modo è possibile per l'altra classe invocare setVisible(true) su StartPanel (in quel metodo invece devi settarlo su false, altrimenti rimarrà il frame sotto).

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 © 2024 vBulletin Solutions, Inc. All rights reserved.