Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [Java] Focus sui tab

  1. #1

    [Java] Focus sui tab

    Salve,

    all'interno di un tab ho messo diversi jpanel, dentro i jpanel sono presenti diversi jtextfield.

    vorrei passare ,tramite tastiera, da un tab all'altro e mettere in focus un determinato jtextfield

    il codice che ho usato è il seguente :
    codice:
    Tab.setSelectedComponent(Panello1);
    textfield5.requestFocusInWindow();
    il jpanel viene selezionato ma il textfield non viene messo "in focus", come mai?
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  2. #2
    up
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  3. #3
    allora ho parzialmente risolto utilizzando il changelistener

    parzialmente perchè col mouse funziona ma tramite tastiera riesco solo a selezionare il tab ma non a dare il focus al relativo jtextfield :

    ps:
    il codice del changelistener è:


    codice:
    Tab.addChangeListener(new ChangeListener() {
                
    
                public void stateChanged(ChangeEvent e) {
    
                     if (Tab.getSelectedIndex() == 0)  {
                        textfield1.requestFocusInWindow();
                    } 
                     if (Tab.getSelectedIndex() == 1)  {
                        textifield5.requestFocusInWindow();
                    } 
                    
                }
            });
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  4. #4
    il codice con cui spero di dare il focus al jtextfield è il seguente :

    codice:
    KeyListener k=new KeyListener() {
    
                public void keyTyped(KeyEvent e) {      }
                
                public void keyPressed(KeyEvent e) {
                    
                    
                    int evt=e.getKeyCode();
    
                    if ((evt==KeyEvent.VK_ENTER)) {                                         
                        String testINS=textfield.getText(); 
                       
                        if (testINS.equalsIgnoreCase("Cambia")) {                                             
                            
                            
                            Tab.setSelectedComponent(Pannello2);   //cambio pannello , OK!                        
                            textField5.requestFocusInWindow(); // provo, vanamente, a dare il focus a textfield 5 :cry:
                        }
    }
    }
    textfield.addKeyListener(k); //Aggiungo il keylistener al jtextfield presente nel pannello 1
    in pratica dall'interno di un keylistener di un jtextfield provo a dare il focus ad un altro jtextfield presente in un altro pannello del jtabbedpane

    concettualmente mi sembra corretto ma nella pratica non funziona , consigli ?
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  5. #5
    ho provato a vedere chi ha il focus con questo codice :

    codice:
    if (testINS.equalsIgnoreCase("2")) {  
                            Tab.setSelectedComponent(Rapporti);
                            
                            if (Tab.isFocusOwner()) {
                                System.out.println("tab si");
                            }
                            else {
                                System.out.println("tab no");
                            }
                            if (pannnello2.isFocusOwner()) {
                                System.out.println("pan2 si");
                            }
                            else {
                                System.out.println("pan2 no");
                            }
                            if (textfield.isFocusOwner()) {
                                System.out.println("si");
                            }
                            else {
                                System.out.println("no");
                            }
                           Tab.requestFocus(true);
                           pannello2.requestFocus();
                           textfield5.requestFocusInWindow(); 
                           if (Tab.isFocusOwner()) {
                                System.out.println("tab dopo si");
                            }
                            else {
                                System.out.println("tab dopo no");
                            }
                           if (Pannello2.isFocusOwner()) {
                                System.out.println("pan2 dopo si");
                            }
                            else {
                                System.out.println("pan dopo no");
                            }
                            if (textfield5.isFocusOwner()) {
                                System.out.println("dopo si");
                            }
                            else {
                                System.out.println("dopo no");
                            }
                               
                           
                        }
    ma risponde sempre e cmq no
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Questo mi risulta che funziona sia con il click del mouse, sia da tastiera usando i mnemonic o usando le frecce quando la linguetta del tab ha il focus.

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class TestFrame extends JFrame
    {
        private JTabbedPane tabbedPane;
        private JTextField textField1a;
        private JTextField textField1b;
        private JTextField textField2a;
        private JTextField textField2b;
        private JTextField textField3a;
        private JTextField textField3b;
    
        public TestFrame ()
        {
            super ("Test Frame");
    
            setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
            setSize (300, 300);
    
            tabbedPane = new JTabbedPane ();
    
            JPanel panel1 = new JPanel (new FlowLayout ());
            textField1a = new JTextField (10);
            panel1.add (textField1a);
            textField1b = new JTextField (10);
            panel1.add (textField1b);
    
            JPanel panel2 = new JPanel (new FlowLayout ());
            textField2a = new JTextField (10);
            panel2.add (textField2a);
            textField2b = new JTextField (10);
            panel2.add (textField2b);
    
            JPanel panel3 = new JPanel (new FlowLayout ());
            textField3a = new JTextField (10);
            panel3.add (textField3a);
            textField3b = new JTextField (10);
            panel3.add (textField3b);
    
            tabbedPane.addTab ("Uno", panel1);
            tabbedPane.setMnemonicAt (0, KeyEvent.VK_U);
            tabbedPane.addTab ("Due", panel2);
            tabbedPane.setMnemonicAt (1, KeyEvent.VK_D);
            tabbedPane.addTab ("Tre", panel3);
            tabbedPane.setMnemonicAt (2, KeyEvent.VK_T);
            add (tabbedPane);
    
            tabbedPane.addChangeListener (new ChangeListener ()
            {
                public void stateChanged (ChangeEvent e)
                {
                    switch (tabbedPane.getSelectedIndex ())
                    {
                        case 0:  textField1b.requestFocusInWindow ();  break;
                        case 1:  textField2b.requestFocusInWindow ();  break;
                        case 2:  textField3b.requestFocusInWindow ();  break;
                    }
                }
            });
        }
    
        public static void main (String[] args)
        {
            SwingUtilities.invokeLater (new Runnable ()
            {
                public void run ()
                {
                    TestFrame f = new TestFrame ();
                    f.setVisible (true);
                }
            });
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Originariamente inviato da andbin
    Questo mi risulta che funziona sia con il click del mouse, sia da tastiera usando i mnemonic o usando le frecce quando la linguetta del tab ha il focus.
    ok, ma il problema è diverso.
    il codice che finora ho postato ha le stesse funzionalità del codice che, gentilmente, hai appena postato.
    rimanendo al tuo esempio io vorrei che quando sono sul textField1b e vorrei passare a textField2b è sufficiente digitare '2' e dare invio piuttosto che cliccare sul tab "Due"
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  8. #8
    ho aggiunto questo al tuo codice per forzare il focus su texfield2b :

    codice:
    KeyListener k13=new KeyListener() {
    
                public void keyTyped(KeyEvent e) {
             
             
                }
                
                public void keyPressed(KeyEvent e) {
                    
                    
                    int evt=e.getKeyCode();
                        String testINS=textField1b.getText(); 
                        if (testINS.equalsIgnoreCase("2")) {  
                            tabbedPane.setSelectedComponent(panel2);
                           
                        } 
                                      
               }
    
                public void keyReleased(KeyEvent e) {
                    //throw new UnsupportedOperationException("Not supported yet.");
                }
            };   
            textField1b.addKeyListener(k13);
            KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher( new KeyEventDispatcher() {
     
    	public boolean dispatchKeyEvent(KeyEvent e) {
                    Boolean x=false;
    		if ( e.getID() == KeyEvent.KEY_TYPED ) {
     
    		// This will get executed whenever you type something,
    		// regardless of what component in your app has focus
     
    			String tellname = tabbedPane.getTitleAt( tabbedPane.getSelectedIndex() );
     
    			if ( tellname.equals( "Due" ) ) {
     
    				if ( !textField2b.isFocusOwner() ) {
     
    					//getRootPane().setDefaultButton( lobbySubmit );
                                        //System.out.println("ciao");
    					textField2b.requestFocus();
    					textField2b.dispatchEvent( e );
                                            x=true;
    				}
    			}
    		
    			}
                    return x;
    		}
    ma dà il seguente errore :
    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
            at sun.awt.windows.WComponentPeer.processSynchronousLightweightTransfer(Native Method)
            at sun.awt.windows.WComponentPeer.requestFocus(WComponentPeer.java:547)
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da JunkyFunki
    rimanendo al tuo esempio io vorrei che quando sono sul textField1b e vorrei passare a textField2b è sufficiente digitare '2' e dare invio piuttosto che cliccare sul tab "Due"
    Ah ... allora la questione è diversa ... non l'avevo capito.

    Ma si può fare. Da quanto dici, non è tanto importante la singola pressione di un tasto 1 2 ec.... ma il contenuto intero del textField quando si preme INVIO.

    Quello che tu hai provato e detto:

    Originariamente inviato da JunkyFunki
    in pratica dall'interno di un keylistener di un jtextfield provo a dare il focus ad un altro jtextfield presente in un altro pannello del jtabbedpane

    concettualmente mi sembra corretto ma nella pratica non funziona
    Tecnicamente è corretto e dovrebbe funzionare. Io infatti ho provato e funziona.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.