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 2011
    Messaggi
    25

    Aiuto pressione tasto INVIO per uso nelle Swing

    Salve ragazzi.. vi spiego in breve cosa sto facendo.. ho scritto in java un programma (lato client e lato server) che funziona da chat.. ovvero compilando e inserendo come argomento l'ip di chi voglio (e se lui naturalmente ha questo programma aperto) possiamo chattare su terminale.. è quindi una semplice chat tra due host con apertura socket e roba varia. Il fatto è che ho voluto implementare un'interfaccia grafica carina per non dover usare il terminale.. ho semplicemente creato un JTextField dove inserire il testo e una JTextArea dove, alla pressione del tasto invio, mi si deve riflettere quello che ho scritto.. ora... non riesco in nessun modo (per incompetenza personale) a utilizzare il tasto INVIO... come faccio a catturare il suo evento in modo tale che quando lo premo si compia una determinata azione? Grazie in anticipo!!

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    sposto in java, se e' il caso verra' rispostata in javascript

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

    Re: Aiuto pressione tasto INVIO per uso nelle Swing

    Originariamente inviato da Bobo90
    ho semplicemente creato un JTextField dove inserire il testo e una JTextArea dove, alla pressione del tasto invio, mi si deve riflettere quello che ho scritto.. ora... non riesco in nessun modo (per incompetenza personale) a utilizzare il tasto INVIO... come faccio a catturare il suo evento in modo tale che quando lo premo si compia una determinata azione? Grazie in anticipo!!
    Per JTextField basta registrare un ActionListener e si ha già "di serie" l'evento alla pressione di INVIO.

    Per JTextArea è diverso. Intanto il tasto <invio> per default fa inserire un newline. Nel caso di una "chat" (o cose simili) potrebbe essere utile gestire ad esempio: <invio> = invia il messaggio e <ctrl+invio> = inserisce un newline. O altre varianti nelle combinazioni di tasti.
    Vedi in questo post dove avevo fatto un esempio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    25
    mmm.. potresti aiutarmi un attimo con il codice? ho una classe finestra in cui estendo JFrame e faccio tutto quello che devo fare.. e ho una classe MyListener che implements Listener in cui ho un metodo ActionPerformed che mi compie l'azione..
    public class Finestra extends JFrame {

    static final String titolo="CHAT INIZIALE";

    final String nome;
    final JPanel northPanel=new JPanel();

    final JPanel southPanel=new JPanel();
    final JButton ok= new JButton("Ok");
    final JButton annulla= new JButton("Annulla"); etc.....
    final JTextField campo= new JTextField(40);

    public class MyListener implements ActionListener,KeyListener{
    Finestra frame;

    public MyListener(Finestra frame){
    this.frame=frame;
    }
    public MyListener(){};

    public void actionPerformed(ActionEvent ev){
    String com = ev.getActionCommand(); che a seconda della stringa "com" fa compiere un certo tipo di azione o meno..

    ora.... se dovessi associare al JTextField campo il tasto INVIO affinchè faccia un'operazione.. che devo mettere?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Bobo90
    ho una classe finestra in cui estendo JFrame e faccio tutto quello che devo fare.. e ho una classe MyListener che implements Listener in cui ho un metodo ActionPerformed che mi compie l'azione..
    Partiamo dalle questioni concettuali: la gestione degli eventi è una cosa che tipicamente deve avere una certa "intimità" con il resto del codice di creazione/gestione della interfaccia utente. Quindi i listener generalmente è bene averli il più vicino possibile alla gestione della interfaccia utente. E che siano oltretutto possibilmente anche nascosti all'esterno.

    Pertanto, e salvo casi particolari, non è buona cosa avere le classi di implementazione dei listener esterne ai frame/pannelli/altro. Lo vedi bene anche tu: hai dovuto passare al costruttore di MyListener il riferimento a Finestra e questa non è una buona cosa.

    Se nel listener dovessi, come scenario di esempio, disabilitare o abilitare il pulsante "Ok" ... cosa fai? In Finestra metti il campo ok come "public"? Pessima idea.
    Metti un metodo "public" es. void abilitaOk(boolean enable) ? Già meglio del campo public ma comunque non buono dal punto di vista del design (a meno che ci siano seri motivi per permettere dall'esterno di (dis)abilitare il Ok).

    Hai colto il nocciolo della questione?

    I listener tipicamente si implementano dentro le classi di gestione della interfaccia utente. In genere con delle "inner class", di tipo "anonymous" o anche "regular" (raramente quelle "local").

    E poi è vero che si può usare il action command per distinguere tra eventuali più pulsanti ma in genere la soluzione più diretta è il confronto dei reference, cioè verificare che il "source" dell'evento sia esattamente uguale (in senso di == dei reference) ad uno dei vari componenti.

    2 scenari di codice di esempio (abbozzati!):


    1) listener distinti come "anonymous inner class"

    codice:
    public class Finestra extends JFrame {
        private JButton ok = new JButton("Ok");
        private JButton annulla = new JButton("Annulla");
        
        public Finestra() {
            // ........
            
            ok.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    // ...... premuto ok
                }
            });
    
            annulla.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    // ...... premuto annulla
                }
            });
        }
    }

    2) listener unico come "regular inner class" che distingue il "source"

    codice:
    public class Finestra extends JFrame {
        private JButton ok = new JButton("Ok");
        private JButton annulla = new JButton("Annulla");
        
        public Finestra() {
            // ........
            
            MyListener myListener = new MyListener();
            
            ok.addActionListener(myListener);
            annulla.addActionListener(myListener);
        }
        
        private class MyListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                Object source = e.getSource();
                
                if (source == ok) {
                    // ...... premuto ok
                } else if (source == annulla) {
                    // ...... premuto annulla
                }
            }
        }
    }
    E non sono gli unici scenari possibili!

    E nota i vari "private" !
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    25
    Sei stato assolutamente fin troppo chiaro sullo scenario che mi hai descritto.. queste cose ce le dicono e le implementiamo per altri tipi di argomenti e visto che il nostro percorso nelle swing è durato un piccolissimo lasso di tempo (nel quale ci hanno giusto insegnato pochi comandi per utilizzare queste librerie) non abbiamo avuto modo di ragionare su queste sfaccettature.. in pratica abbiamo solo spalato bit scrivendo codice-.- ma questo perchè era solo una brevissima tappa di un nostro esame.. ti ringrazio assolutamente quindi per avermi illuminato questa faccia delle swing!! Arriviamo al dunque del mio problema perchè purtroppo non ho ancora capito come posso sfruttare l'evento generato dalla pressione del pulsante ok xD lo so che sono ottuso.. ma purtroppo non mi so destreggiare benissimo con le swing.. ti sarei grato se mi facessi un esempio come hai fatto nell'ultimo post in cui mi posti del codice in modo che possa capire direttamente come poter utilizzare questi eventi! Grazie ancora veramente!!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Bobo90
    ti sarei grato se mi facessi un esempio come hai fatto nell'ultimo post in cui mi posti del codice in modo che possa capire direttamente come poter utilizzare questi eventi! Grazie ancora veramente!!
    Un esempio per aggiungere elementi in un JList da un JTextField:

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Finestra extends JFrame {
        private JTextField campoTesto;
        private DefaultListModel model;
        private JList lista;
        private JButton pulsanteAggiungi;
    
        public Finestra() {
            super("Aggiungi in lista");
    
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(400, 300);
    
            campoTesto = new JTextField();
            model = new DefaultListModel();
            lista = new JList(model);
            pulsanteAggiungi = new JButton("Aggiungi");
    
            getContentPane().add(campoTesto, BorderLayout.NORTH);
            getContentPane().add(lista, BorderLayout.CENTER);
            getContentPane().add(pulsanteAggiungi, BorderLayout.SOUTH);
    
            ListenerAggiungi lisAggiungi = new ListenerAggiungi();
    
            campoTesto.addActionListener(lisAggiungi);        // Per INVIO sul campo
            pulsanteAggiungi.addActionListener(lisAggiungi);  // Per click sul pulsante
        }
    
        private class ListenerAggiungi implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                if (campoTesto.getText().length() > 0) {
                    model.addElement(campoTesto.getText());
    
                    campoTesto.setText("");
                    campoTesto.requestFocusInWindow();
                }
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new Finestra().setVisible(true);
                }
            });
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    25
    ok ho capito come sfrutta il tasto invio l'esempio.. non ho avuto tempo ancora di rimodificare la struttura secondo il tuo post precedente.. però ho fatto che nella classe che implementa il JFrame al campo JTextField associo il mio listener..

    public class Finestra extends JFrame{
    ...
    final MyListener listener = new MyListener();
    private final JTextField campo;
    ...
    campo.addActionListener(listener);
    ...



    public class MyListener implements ActionListener{
    ...
    public void actionPerformed(ActionEvent ev){
    if (frame.campo.getText().length() > 0) {
    String s=frame.getAreaTesto().getText();
    System.out.println(s);
    frame.campo.setText("");
    frame.area.setText(frame.nome+"--->"+s+"\n"); //subito sotto il JTextField ho una JTextArea dove voglio
    scrivere il contenuto inserito nel JTextField
    frame.campo.requestFocusInWindow(); //che a breve mi andrò a cercare a cosa serve
    ...
    }

    purtroppo mi da errore non a tempo di compilazione ma di esecuzione:

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at MyListener.actionPerformed(MyListener.java:19)
    at javax.swing.JTextField.fireActionPerformed(JTextFi eld.java:509)
    at javax.swing.JTextField.postActionEvent(JTextField. java:722)
    at javax.swing.JTextField$NotifyAction.actionPerforme d(JTextField.java:837)
    at javax.swing.SwingUtilities.notifyAction(SwingUtili ties.java:1664)
    at javax.swing.JComponent.processKeyBinding(JComponen t.java:2851)
    at javax.swing.JComponent.processKeyBindings(JCompone nt.java:2886)
    at javax.swing.JComponent.processKeyEvent(JComponent. java:2814)
    at java.awt.Component.processEvent(Component.java:598 0)
    at java.awt.Container.processEvent(Container.java:210 5)
    at java.awt.Component.dispatchEventImpl(Component.jav a:4564)
    at java.awt.Container.dispatchEventImpl(Container.jav a:2163)
    at java.awt.Component.dispatchEvent(Component.java:43 90)
    at java.awt.KeyboardFocusManager.redispatchEvent(Keyb oardFocusManager.java:1881)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEv ent(DefaultKeyboardFocusManager.java:749)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKe yEvent(DefaultKeyboardFocusManager.java:1025)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAsse rtions(DefaultKeyboardFocusManager.java:892)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent (DefaultKeyboardFocusManager.java:713)
    at java.awt.Component.dispatchEventImpl(Component.jav a:4434)
    at java.awt.Container.dispatchEventImpl(Container.jav a:2163)
    at java.awt.Window.dispatchEventImpl(Window.java:2478 )
    at java.awt.Component.dispatchEvent(Component.java:43 90)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:649)
    at java.awt.EventQueue.access$000(EventQueue.java:96)
    at java.awt.EventQueue$1.run(EventQueue.java:608)
    at java.awt.EventQueue$1.run(EventQueue.java:606)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectio nPrivilege(AccessControlContext.java:105)
    at java.security.AccessControlContext$1.doIntersectio nPrivilege(AccessControlContext.java:116)
    at java.awt.EventQueue$2.run(EventQueue.java:622)
    at java.awt.EventQueue$2.run(EventQueue.java:620)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectio nPrivilege(AccessControlContext.java:105)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java: 619)
    at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:138)

    te l'ho postato giusto per fartelo vedere se ti serve..

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Bobo90
    private final JTextField campo;

    if (frame.campo.getText().length() > 0) {
    Se 'campo' è private ... mi spieghi come faresti ad accederci direttamente? Non puoi.


    Originariamente inviato da Bobo90
    frame.campo.requestFocusInWindow(); //che a breve mi andrò a cercare a cosa serve
    ...
    richiede che al componente (su cui è invocato) venga dato il "focus".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    25
    Perdonami ti ho scritto io una cavolata. Non è private il campo.. cmq anche se lo fosse stato mi avrebbe dato errore a livello di compilazione non esecuzione.. non è li l'errore..

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.