Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446

    [JAVA]Azioni differenziate per più pulsanti

    Salve,sto seguendo un libro per studiare un po' awt e swing,in un esercizio mi riporta questo codice:

    // Fig. 13.10: ButtonTest.java
    // Creating JButtons.
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class ButtonTest extends JFrame {
    private JButton plainButton, fancyButton;

    // set up GUI
    public ButtonTest()
    {
    super( "Testing Buttons" );

    // get content pane and set its layout
    Container container = getContentPane();
    container.setLayout( new FlowLayout() );

    // create buttons
    plainButton = new JButton( "Plain Button" );
    fancyButton = new JButton( " Fancy Button");
    container.add( plainButton );
    container.add( fancyButton );

    // create an instance of inner class ButtonHandler
    // to use for button event handling
    ButtonHandler handler = new ButtonHandler();
    fancyButton.addActionListener( handler );
    plainButton.addActionListener( handler );

    setSize( 275, 100 );
    setVisible( true );

    } // end ButtonTest constructor

    public static void main( String args[] )
    {
    ButtonTest application = new ButtonTest();
    application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }

    // inner class for button event handling
    private class ButtonHandler implements ActionListener {

    // handle button event
    public void actionPerformed( ActionEvent event )
    {
    JOptionPane.showMessageDialog( ButtonTest.this,
    "Hai premuto: " + event.getActionCommand() );
    }

    } // end private inner class ButtonHandler

    }


    ho modificato l'esempio creando un secondo pulsante come il plain button(l'altro all'inizio era un'immagine) ora vorrei che i due pulsanti eseguissero azioni differenti,mentre al momento se clicco uno o l'altro esegue la stessa azione.Per esempio vorrei che se venisse premuto il plain dica "hai premuto il plain" se invece venisse premuto il fancy dica "2+2 fa 4".Ovviamente è solo un esempio.Avete qualche link chiaro a riguardo?Grazie.
    Altra cosa vorrei sapere come dare il nome ad un pulsante esempio "Avvia" e una volta premuto cambiarne il nome con "Disattiva" ed ovviamente eseguire una seconda azione ma differente.
    Grazie a chi mi aiuterà!E buona giornata!

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Dentro l'ActionPerformed devi usare il metodo getSource() per farti restituire il componente che ha provocato la chiamata al metodo. Con degli if puoi differenziare i comportamenti a seconda del componente chiamante e del suo stato. Ti posto un'esempio abbastanza comprensibile.

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class MioFrame  extends JFrame implements ActionListener {
        private JButton plainButton, fancyButton;
        
        public MioFrame() {
            //Creo il frame
            super("MioFrame v1.0");
            Container container = this.getContentPane();
            container.setLayout(new FlowLayout());
            plainButton = new JButton("Plain Button");
            plainButton.addActionListener(this);
            fancyButton = new JButton("Fancy Button");
            fancyButton.addActionListener(this);
            container.add(plainButton);
            container.add(fancyButton);
            this.setSize(275, 100);
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.setVisible(true);
        }
        
        public void actionPerformed(ActionEvent e) {
            //Prendo l'oggetto che ha scatenato l'evento
            Object source = e.getSource();
            //A seconda dell'oggetto eseguo codice differente
            if(source.equals(plainButton)) {
                //A seconda del testo del bottone eseguo codice differente
                if(plainButton.getText().equals("Plain Button")) {
                    plainButton.setText("Fghjk Button");
                    JOptionPane.showMessageDialog(this,"Hai premuto: " + e.getActionCommand());
                } else {
                    plainButton.setText("Plain Button");
                    JOptionPane.showMessageDialog(this,"Faccio altro");
                }
            } else if(source.equals(fancyButton)) {
                JOptionPane.showMessageDialog(this,"2+2 = 4");
            }
        }
        
        public static void main(String[] args) {
            new MioFrame();
        }
    }

  3. #3
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446
    grazie mille simo,provo immediatamente

  4. #4
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446
    allora simo,funziona tutto alla grande però ho difficoltà a modificare il codice per assegnare l'azione,mi spiego meglio devo praticamente assegnare al pulsante Avvia,l'avvio di un metodo che gestisca le eccezioni throws IOException.Al momento il codice da avviare è racchiuso nel metodo main,ora l'ho trasferito in un altro metodo che vorrei avviare appunto tramite il tasto Avvia.Ho provato a creare il metodo run ed utilizzare la chiamata istanza.start();(per esempio) ma mi da un errore dicendo che il metodo run non può gestire le throws IOException...Spero di essermi spiegato,puoi aiutarmi ancora?

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Il metodo run ereditato da thread non puo' sollevare IOException (perche' quello di thread non lo fa, vedere concetto di ereditarietà), quindi gestiscila dentro il run con un try-catch.

    P.s. Spesso Thread+Swing non sono un accoppiata felice e non funzionano alla perfezione. Documentati sulla classe SwingWorker e cerca di usare quella se possibile.

  6. #6
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446
    Originariamente inviato da simo7784
    Il metodo run ereditato da thread non puo' sollevare IOException (perche' quello di thread non lo fa, vedere concetto di ereditarietà), quindi gestiscila dentro il run con un try-catch.

    P.s. Spesso Thread+Swing non sono un accoppiata felice e non funzionano alla perfezione. Documentati sulla classe SwingWorker e cerca di usare quella se possibile.
    perfetto simo con il try catch funziona,non ci avevo proprio pensato.Però ho notato un difetto adesso,dopo aver premuto il tasto avvia il programma lancia quella parte di codice e inizia a funzionare,però il tasto avvia rimane bloccato e il programma (o meglio la GUI) si blocca,infatti non si chiude premendo la x.Hai idee del perchè?

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Probabile che sia colpa del thread e che la parte grafica del'applicazione rimanga bloccata fino alla terminazione del thread stesso (te l'avevo accennato sopra).

  8. #8
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446
    Originariamente inviato da simo7784
    Probabile che sia colpa del thread e che la parte grafica del'applicazione rimanga bloccata fino alla terminazione del thread stesso (te l'avevo accennato sopra).
    mmm stavo leggendo qualcosa riguardo swing worker ma è ancora troppo complicato per le mie conoscenze,puoi consigliarmi un'altro modo per ovviare al problema?

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    E' piu' facile imparare ad usare swingworker che analizzare tutto il design per renderlo compatibile con i thread. Oltretutto l'utilizzo di swingworker e' identico a quello di un thread, cambia solo il nome del metodo da implementare. Altrimenti si può usare swing.Timer se l'azione va ripetuta ogni tot ms. Prova a descrivere cosa ti serve.

  10. #10
    Utente di HTML.it L'avatar di energie
    Registrato dal
    Apr 2003
    Messaggi
    446
    Originariamente inviato da simo7784
    E' piu' facile imparare ad usare swingworker che analizzare tutto il design per renderlo compatibile con i thread. Oltretutto l'utilizzo di swingworker e' identico a quello di un thread, cambia solo il nome del metodo da implementare. Altrimenti si può usare swing.Timer se l'azione va ripetuta ogni tot ms. Prova a descrivere cosa ti serve.
    ho dato una lettura agli esempi sul sito della sun,ma sono un po' troppo complicati per me,tuttavia sto continuando a leggerli.
    Allora nella mia GUI sono presenti due pulsanti,un tasto "Info" che apre un dialog informativo,e un tasto "Avvia" che avvia un server per la ricezione di files.Appunto vorrei che il tasto avvia avviasse il server,ma che una volta premuto lasciasse utilizzabile il resto del programma

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.