Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [Java] jTabbedPane e eventi tastiera

    seguendo una piccola guida sul web ho visto come impostare i tasti per cambiare tab in un jTabbedPane.
    io ho fatto così:
    codice:
    jTabbedPane1 = new javax.swing.JTabbedPane();
    // AGGIUNGO DUE TAB CON JPANEL
    jTabbedPane1.setMnemonicAt(0, KeyEvent.VK_A);
    jTabbedPane1.setMnemonicAt(1, KeyEvent.VK_B);
    getContentPane().add(jTabbedPane1, java.awt.BorderLayout.CENTER);
    visimamente è tutto ok, nel senso che ci sono due tab con i rispettivi jpanel e tutto il resto.
    solo che i tasti nn funzionano.
    inoltre vorrei anche se fosse possibile impostare solo la combinazione Ctrl+Tab tipo in firefox.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il setMnemonic serve ad impostare il mnemonico (come nei menu)... e si attiva facendo ALT + il tasto indicato (nel tuo caso, ALT + A per la prima tab e ALT + B per la seconda).

    Se vuoi fare in modo che la tab venga selezionata con il solo pulsante A devi gestire un KeyListener sul contenitore che intercetti i tasti e faccia programmaticamente un setSelectedIndex().

    Il CTRL + TAB è già funzionante di suo senza dover fare nulla...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    ah ok nn sapevo come funzionasse il mnemonico.

    a me cmq il Ctrl+TAB nn funziona.
    quando clicco mi cambia solo focus come se premessi solo il TAB.
    sto su windows 7 e jdk 7.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da fermat
    a me cmq il Ctrl+TAB nn funziona.
    quando clicco mi cambia solo focus come se premessi solo il TAB.
    sto su windows 7 e jdk 7.
    Questo comportamento, effettivamente, viene attivato automaticamente se si usa il Look&Freel di Windows (io, regolarmente, nelle mie applicazioni faccio sempre caricare il L&F di sistema).

    codice:
    // Carico il L&F di sistema
    try {
       UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
    } catch (Exception e) { /* Eccezione nel UIManager... fa niente */ }
    Se, per qualche ragione, non puoi usare il L&F di sistema, ho trovato questa soluzione:

    codice:
    // Creo i KeyStroke per la gestione di CTRL+TAB e CTRL+SHIFT+TAB
    KeyStroke ctrlTab = KeyStroke.getKeyStroke("ctrl TAB");
    KeyStroke ctrlShiftTab = KeyStroke.getKeyStroke("ctrl shift TAB");
     
    // Rimuovo il normale comportamento associato al CTRL+TAB
    Set<AWTKeyStroke> forwardKeys = new HashSet<AWTKeyStroke>(tabbedPane.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
    forwardKeys.remove(ctrlTab);
    tabbedPane.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
     
    // Rimuovo anche quello del CTRL+SHIFT+TAB
    Set<AWTKeyStroke> backwardKeys = new HashSet<AWTKeyStroke>(tabbedPane.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
    backwardKeys.remove(ctrlShiftTab);
    tabbedPane.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backwardKeys);
     
    // Rimappo i comportamenti
    InputMap inputMap = tabbedPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    inputMap.put(ctrlTab, "navigateNext");
    inputMap.put(ctrlShiftTab, "navigatePrevious");
    Questo perchè il CTRL+TAB, di default, viene usato per poter uscire da un controllo di testo: se, ad esempio, hai una JTextArea e premi il TAB, non passi al prossimo componente ma inserisci una tabulazione nel testo... come si fa, invece, a passare al prossimo controllo? Semplice: CTRL+TAB. (che, per gli utenti Windows, è il normale cambio di scheda)

    In questo modo si dovrebbe sovrascrivere il comportamento di default con quello "standard" dei sistemi Windows.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    bhe a dire il vero nn c'è un vero motivo per nn usare il L&F originale.
    nn ci avevo ancora pensato (tranne che sul Mac).
    a forse è meglio usare quello originale.
    anche su W7 rende meglio.
    grazie per la spiegazione!!

  6. #6
    allora.
    su linux anche con il L&F di default la combinazione nn funziona.
    quiandi ho implementato la tua soluzione aggiungendo al JTabbedPane l'evento KeyPressed:
    codice:
        private void tabbedPaneKeyPressed(java.awt.event.KeyEvent evt) {
            // Creo i KeyStroke per la gestione di CTRL+TAB e CTRL+SHIFT+TAB
            KeyStroke ctrlTab = KeyStroke.getKeyStroke("ctrl TAB");
            KeyStroke ctrlShiftTab = KeyStroke.getKeyStroke("ctrl shift TAB");
            // Rimuovo il normale comportamento associato al CTRL+TAB
            Set<AWTKeyStroke> forwardKeys = new HashSet<AWTKeyStroke>(tabbedPane.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
            forwardKeys.remove(ctrlTab);
            tabbedPane.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
            // Rimuovo anche quello del CTRL+SHIFT+TAB
            Set<AWTKeyStroke> backwardKeys = new HashSet<AWTKeyStroke>(tabbedPane.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
            backwardKeys.remove(ctrlShiftTab);
            tabbedPane.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backwardKeys);
            // Rimappo i comportamenti
            InputMap inputMap = tabbedPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
            inputMap.put(ctrlTab, "navigateNext");
            inputMap.put(ctrlShiftTab, "navigatePrevious");
        }
    tenendo il L&F di default.
    funziona!
    domani lo provo anche su W7 per vedere se ci sono controindicazioni!

  7. #7
    mi sono reso conto di questo.
    su W7 funziona bene sia con che senza l'esempio che mi hai postato, e penso sia normale.
    su linux invece (con KDE) funziona solo a volte.
    nn sono riuscito a capire se dipende da qualche cosa che faccio mentre uso il programma o meno.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Attenzione che quel codice non va messo all'interno della gestione del KeyPressed: va richiamato una ed una sola volta, subito dopo aver creato il JTabbedPane. Quel codice ridefinisce il comportamento di default del JTabbedPane e non va richiamato "ad ogni pressione di un tasto", ma solo al momento della creazione del JTabbedPane.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    io avevo provato una cosa del genere:
    codice:
        public FrameMain() { // COSTRUTTORE DEL JFRAME
            initComponents();
            tabbedPaneKey();
            setLocationRelativeTo(null);
        }
    .......
        private void tabbedPaneKey() {
            // Creo i KeyStroke per la gestione di CTRL+TAB e CTRL+SHIFT+TAB
            KeyStroke ctrlTab = KeyStroke.getKeyStroke("ctrl TAB");
            KeyStroke ctrlShiftTab = KeyStroke.getKeyStroke("ctrl shift TAB");
            // Rimuovo il normale comportamento associato al CTRL+TAB
            Set<AWTKeyStroke> forwardKeys = new HashSet<AWTKeyStroke>(tabbedPane.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
            forwardKeys.remove(ctrlTab);
            tabbedPane.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
            // Rimuovo anche quello del CTRL+SHIFT+TAB
            Set<AWTKeyStroke> backwardKeys = new HashSet<AWTKeyStroke>(tabbedPane.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
            backwardKeys.remove(ctrlShiftTab);
            tabbedPane.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backwardKeys);
            // Rimappo i comportamenti
            InputMap inputMap = tabbedPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
            inputMap.put(ctrlTab, "navigateNext");
            inputMap.put(ctrlShiftTab, "navigatePrevious");
        }
    un metodo privato richiamato nel costruttore.
    ma anche così su linux nn funge.
    o intendevi altro??

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.