Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    561

    Problema con l'abilitazione di un jButton

    dunque ho le seguenti classi:

    GUI
    SocketClient
    Main


    La classe Main contiene il main dell'applicazione e crea un'istanza della classe GUI che contiene l'interfaccia principale dell'applicazione.
    Nella GUI ci sono due Button: Connect e Send Info. Il primo è inizialmente abilitato, il secondo disabilitato. Quindi, per prima cosa premo Connect che mi esegue il metodo SocketClient.connect(this). Come si nota a questo metodo viene passata la GUI.
    Se la connessione è avvenuta correttamente devo abilitare Send Info e questo lo faccio nel metodo SocketClient.connect().
    Allora così il pulsante rimane disabilitato, inoltre ho anche provato a fare il refresh() in connect() della GUI ma mi viene addirittura gettata un'eccezione.

    come posso risolvere il problema?


    tulipan

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

    Re: Problema con l'abilitazione di un jButton

    Originariamente inviato da tulipan
    come posso risolvere il problema?
    Bisognerebbe vedere meglio il codice che hai scritto. Posso solo fare una ipotesi ... l'errore classico è sulle questioni relative ai thread.
    Quelle operazioni sui socket le stai facendo nel contesto del EDT (event-dispatch-thread) o nel contesto di un tuo thread?
    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
    Jan 2007
    Messaggi
    561
    allora per SocketClient non ho creato un nuovo Thread ma nella classe GUI ci sono due TextField Date e Time che vengono aggiornati da un thread Orologio non so se questo può creare un problema


    tulipan

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tulipan
    allora per SocketClient non ho creato un nuovo Thread ma nella classe GUI ci sono due TextField Date e Time che vengono aggiornati da un thread Orologio non so se questo può creare un problema
    Sì che può creare problemi ... se non conosci bene la questione dei thread nelle interfacce utente.

    --> Threads and Swing
    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
    Jan 2007
    Messaggi
    561
    scusa ma cosa credi dovrei fare per risolvere il problema......eliminare il thread Orologio?


    tulipan

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tulipan
    scusa ma cosa credi dovrei fare per risolvere il problema......eliminare il thread Orologio?
    Vediamo la questione in generale: le interfacce utente AWT/Swing non sono thread-safe. Salvo poche operazioni, peraltro chiaramente documentate come thread-safe nel javadoc delle API, le modifiche alla interfaccia utente vanno fatte solo ed esclusivamente nel contesto del EDT (event-dispatch-thread).

    Inoltre il EDT non va bloccato per troppo tempo, quindi operazioni potenzialmente lunghe (scrittura/lettura di file, socket, ecc...) vanno fatte in un altro thread separato.

    Quando si deve poi andare ad agire nuovamente sulla interfaccia utente, si deve ripassare nel contesto del EDT, usando le solite invokeLater/invokeAndWait.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    561
    saresti così gentile da fare un esempio su come su usano invokeLater/invokeAndWait?


    tulipan

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    561

    Ho modificato la SocketClient .......

    facendola diventare un Thread però adesso non mi aggiorna la textarea .

    ecco il codice:

    codice:
    public class SocketClient extends Thread{
    
        private boolean autorizzazione=false;
        private Socket socket=null;
        private DataInputStream input = null;
        private DataOutputStream output = null;
        private static boolean DEBUG = false;
        private GUI frame=null;
        public SocketClient() {
        }
        public void setGUI(GUI frame){
          this.frame=frame;
        }
        public void run(){
            FileConfig f=new FileConfig();
            try{
              frame.writeTextArea("Trying to connect.....");
              f.readProperties();
              socket=new Socket(InetAddress.getByName("localhost"),f.getPort());  
              input =new DataInputStream(new BufferedInputStream(socket.getInputStream()));
              output = new DataOutputStream( new BufferedOutputStream(socket.getOutputStream()));
              output.flush();
              output.writeInt(10);
              output.flush();
              String x=input.readUTF();
              if(x.equals("OK")){
                  output.writeInt(f.getIDShip());
                  output.flush();
                  String r=input.readUTF();
                  if(r.equals("ACK")){
                      frame.writeTextArea("Server authorization done. Client identified");
                      autorizzazione=true;
                      frame.setEnabledButton5();
                      ///frame.refresh();
                  }
              }  
            }catch (IOException e) {
                System.err.println((e.getMessage())); 
                if(e.getMessage().equals("Connection refused: connect"))
                    frame.writeTextArea("Connection refused");  
                else 
                    frame.writeTextArea("Problem with configuration file");
            }catch(Exception eof){
                System.err.println(eof.getMessage());
            }
            f=null;
         }
         public boolean getAutorizzazione(){
            return autorizzazione;
         }
    }
    il metodo run() riesce a stampare il messaggio "Trying to connect....." ma poi non stampa gli altri.


    tulipan

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Supponendo di avere un JButton che avvia un lavoro lungo e il pulsante va subito disabilitato e poi riabilitato solo dopo la fine del lavoro, un codice tipico è questo:

    codice:
    private JButton buttonEsegui;
    .....
    
    public void actionPerformed (ActionEvent ae)
    {
        buttonEsegui.setEnabled (false);   // disabilita
    
        Thread t = new Thread (new LavoroLungo ());
        t.start ();
    }
    
    private class LavoroLungo implements Runnable
    {
        public void run ()
        {
            // .... lavoro lungo ....
    
            SwingUtilities.invokeLater (new Runnable () {
                public void run () {
                    buttonEsegui.setEnabled (true);    // riabilita
                }
            });
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Mi intriga non poco sto discorso sull' EDT... Per gestire questo genere di problemi ho fatto dei tacconi da paura. Hai a portata di mano qualche altro link interessante come quello che hai postato prima?

    Grazie andbin


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