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

    Jtable editabile con celle JtextField - problemi di Focus con altri componenti

    Buonasera a tutti, sono nuovo del forum. Spero qualcuno di voi possa darmi una mano su un problema che mi porto dietro da tempo e di cui non riesco a trovare soluzione ammesso che alla fine non sia un bug di java...
    Spiego il progetto Java:


    - JInternalFrame con all'interno
    - JTabbedPane con all'interno
    - Componenti quali JtextField, JPanel con all'interno JTable, ComboBox etc
    Lo spostamento da un componente all'altro usando la tastiera è gestito da una classe FocusTraversalPolicy legata al JTabbedPane; in questa classe si gestisce l'avanzamento di componente in componente con i tasti TAB e ShiftTab; tutto funziona meravigliosamente pure nel caso di componente Jtable se non si è ancora in Edit di cella.
    Preciso che al componente Jtable ho disattivato i tasti Tab e ShifTab perchè non siano utilizzati per movimenti tra celle e possono essere utilizzati per uscire dal JTable Stesso.
    ActionMap myTableActionMap = myTable.getActionMap();
    myTableActionMap.put("selectPreviousColumnCell", new myPreviousFocusHandler());
    myTableActionMap.put("selectNextColumnCell", new myNextFocusHandler());
    public class myPreviousFocusHandler extends AbstractAction
    {
    public void actionPerformed(ActionEvent evt)
    {
    KeyboardFocusManager myManager = KeyboardFocusManager.getCurrentKeyboardFocusManage r();
    myManager.focusPreviousComponent();
    }
    }
    public class myNextFocusHandler extends AbstractAction
    {
    public void actionPerformed(ActionEvent evt)
    {
    KeyboardFocusManager myManager = KeyboardFocusManager.getCurrentKeyboardFocusManage r();
    myManager.focusNextComponent();
    }
    }


    Nel caso di edit di cella (JTextField) nel JTable se si preme il tasto TAB il programma si comporta come è nelle mie attese:
    - Passa il controllo al FocusTraversalPolicy del JtabbedPane
    - Passa da StopCellEditing della cella in edit
    - Passa da getCellEditorValue della cella in edit
    - Passa da FocusLost di un Listener sulla JTable dove si rileva che il prossimo componente è quello corretto a cui passa il focus
    - Attiva il focus sul componente successivo
    Nel caso di edit di cella (JTextField) nel JTable se si preme il tasto ShiftTAB il programma si comporta come non è nelle mie attese e diversamente dal tasto TAB:
    - NON Passa il controllo al FocusTraversalPolicy del JtabbedPane
    - NON Passa da StopCellEditing della cella in edit
    - NON Passa da getCellEditorValue della cella in edit
    - Passa da FocusLost di un Listener sulla JTable dove si rileva che il prossimo componente è lo stesso JTextField che gestisce l'edit di cella.
    - Rimane attiva la stessa cella della JTable in uno stato non si capisce se di edit o meno.

    Spero di essere stato chiaro
    L'intero sorgente è troppo esteso per poter essere pubblicato ma non ho problemi a riportarne pezzi se vi puo' essere utile.


    Ringrazio in anticipo chi volesse aiutarmi

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Metti le tue due action così:

    codice:
    public class myPreviousFocusHandler extends AbstractAction {
        public void actionPerformed(ActionEvent evt) {
            JTable table = (JTable) evt.getSource();
    
            if (table.isEditing()) {
                table.getCellEditor().stopCellEditing();
            }
    
            KeyboardFocusManager myManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            myManager.focusPreviousComponent(table);
        }
    }

    codice:
    public class myNextFocusHandler extends AbstractAction {
        public void actionPerformed(ActionEvent evt) {
            JTable table = (JTable) evt.getSource();
    
            if (table.isEditing()) {
                table.getCellEditor().stopCellEditing();
            }
    
            KeyboardFocusManager myManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            myManager.focusNextComponent(table);
        }
    }

    Se al tab/shift-tab invece di accettare il valore nella cella ti interessa annullare l'editing, allora invece di stopCellEditing() semplicemente fai cancelCellEditing(). Puoi scegliere tu.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Grazie andbin ma non è questo il mio problema.
    Quel codice che ho postato era solo per far capire il modo in cui avevo bloccato i tasti Tab e Shift Tab dal loro naturale utilizzo come tasti di spostamento tra celle della JTable. E sotto questo aspetto le due classi funzionano entrambe cosi come sono.
    In questo modo, a mio avviso, i 2 tasti dovrebbero essere tornati alla loro funzione di spostamento tra componenti del JTabbedPane.


    Se premo il tasto TAB in effetti funziona come mi aspetto e come ho indicato nel primo post:
    Passa dal getComponentAfter della classe FocusTraversalPolicy del JTabbedpane che fa passare il focus al componente successivo alla JTable.


    Mi aspetterei che anche premendo il tasto Shift Tab succedesse la stessa cosa;
    Ma in questo caso non passa dal getComponentBefore della classe FocusTraversalPolicy del JTabbedpane ma:
    - Passa da FocusLost di un Listener sulla JTable dove ho potuto rilevare che il prossimo componente che riceverà il focus è lo stesso JTextField che gestisce l'edit di cella.


    E' qui che non capisco questa difformità di comportamento

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