| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | FocusListener, hvad kan være det? Fra : Preben Holm | 
  Dato :  24-08-04 12:32 |  
  |   
            Hej alle,
 
 jeg sidder her og prøver at lege med FocusListener. Jeg har gjort som 
 følger, men der sker ikke noget:
 
 public class KassekladdePanel extends JPanel implements FocusListener {
      private JTextField[][] fields;
 
      private DefaultKeyboardFocusManager myFocusmgr = new 
 DefaultKeyboardFocusManager();
 
 
      public KassekladdePanel() {
          KeyboardFocusManager.setCurrentKeyboardFocusManager(myFocusmgr);
 
 
          //Set
          Set set;
 
          // Change the forward focus traversal keys for the application
          set = new 
 HashSet(myFocusmgr.getDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
          set.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false));
  
 myFocusmgr.setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, 
 set);
 
          // Change the backward focus traversal keys for the application
          set = new 
 HashSet(myFocusmgr.getDefaultFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
          set.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 
 InputEvent.SHIFT_MASK, false));
  
 myFocusmgr.setDefaultFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, 
 set);
 
          // Adjust the focus traversal order
 
     fields[rows-1][cols-1].setNextFocusableComponent(fields[rows-1][0]);
 
 
          // Add this panel to the FocusListener
          this.addFocusListener(this);
          fields[0][0].setText("Test");
      }
 
 
      // & --- Focus Listeners --- &
      public void focusLost(FocusEvent e) {
          JTextField gained = (JTextField) e.getOppositeComponent();
 //        gained.setText("Gained focus");
 
          fields[0][0].setText("Test 2");
      }
 
      public void focusGained(FocusEvent e) {
          JTextField lost = (JTextField) e.getOppositeComponent();
 //        lost.setText("Lost focus");
 
          fields[0][0].setText("Test 2");
      }
 }
 
 
 men feltet fields[0][0] ændrer ikke tekst selvom der skiftes mellem de 
 forskellige felter.
 
 Spørgsmålet er så - kan et JPanel anvendes som FocusListener (jeg kan 
 ikke se hvorfor det ikke skulle kunne det)
 
 Håber nogle friske gutter og "gutinder" har svar på rede hånd.
 
 
 Mvh / Preben Holm
  
            
             |   |   
            
        
 
            
         
           Niels Dybdahl (24-08-2004) 
         
	
            | Kommentar Fra : Niels Dybdahl | 
  Dato :  24-08-04 12:59 |  
  |   
            > Spørgsmålet er så - kan et JPanel anvendes som FocusListener (jeg kan
 > ikke se hvorfor det ikke skulle kunne det)
 
 Det kan det godt, men det gør ikke koden særlig læselig. Lav hellere et
 dedikeret objekt til formålet.
 Er du sikker på at den viste kode kan compilere ?
 
 Niels Dybdahl
 
 
  
            
             |   |   
            
        
 
            
         
           Preben Holm (24-08-2004) 
         
	
            | Kommentar Fra : Preben Holm | 
  Dato :  24-08-04 14:31 |  
  |   
            Niels Dybdahl wrote:
 >>Spørgsmålet er så - kan et JPanel anvendes som FocusListener (jeg kan
 >>ikke se hvorfor det ikke skulle kunne det)
 > 
 > 
 > Det kan det godt, men det gør ikke koden særlig læselig. Lav hellere et
 > dedikeret objekt til formålet.
 
 Alle eksempler jeg læser skriver f.eks.
 
 public class Navn extends Frame implements FocusListener {
 
    public Navn {
       this.addFocusListener(this);
    }
 }
 
 er det stadig smart at dedikere det ud til en anden klasse hvis jeg skal 
 hente data fra mange af felterne (JTextFields) og sende dem til et andet 
 objekt for at gemme dataene der står i disse?
 
 
 > Er du sikker på at den viste kode kan compilere ?
 
 Ja, med mindre jeg har copy pasted lidt rodet (fjernede lidt af 
 "sprøjtet" fra koden, så det kan godt være objekterne fields[][] ikke er 
 oprettet - tror jeg ikke. Så nej, det kan den nok ikke. Men eksemplet er 
 som sådan ellers godt nok.
 
 Mvh / Preben Holm
  
            
             |   |   
            
        
 
            
         
           Martin Husted Hartvi~ (25-08-2004) 
         
	
            | Kommentar Fra : Martin Husted Hartvi~ | 
  Dato :  25-08-04 08:36 |  
  |   
            Ikke at jeg vil løse dit problem, men måske har du overset at
 
 Du laver en
 
 >           // Add this panel to the FocusListener
 >         this.addFocusListener(this);
 
 Men hvad er der lige der giver dit panel fokus? Jeg tror ikke du virkelig  
 mener, at du vil teste for fokus på et panel.
 
 Hilsen
 Martin
 
 
 
 
 
 
 On Tue, 24 Aug 2004 13:32:02 +0200, Preben Holm  
 <64bitNonoSPAMno@mailme.dk> wrote:
 
 > Hej alle,
 >  jeg sidder her og prøver at lege med FocusListener. Jeg har gjort som  
 > følger, men der sker ikke noget:
 >  public class KassekladdePanel extends JPanel implements FocusListener {
 >     private JTextField[][] fields;
 >      private DefaultKeyboardFocusManager myFocusmgr = new  
 > DefaultKeyboardFocusManager();
 >       public KassekladdePanel() {
 >         KeyboardFocusManager.setCurrentKeyboardFocusManager(myFocusmgr);
 >           //Set
 >         Set set;
 >          // Change the forward focus traversal keys for the application
 >         set = new  
 > HashSet(myFocusmgr.getDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
 >         set.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false));
 >  myFocusmgr.setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,  
 > set);
 >          // Change the backward focus traversal keys for the application
 >         set = new  
 > HashSet(myFocusmgr.getDefaultFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
 >         set.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,  
 > InputEvent.SHIFT_MASK, false));
 >  myFocusmgr.setDefaultFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS,  
 > set);
 >          // Adjust the focus traversal order
 >     fields[rows-1][cols-1].setNextFocusableComponent(fields[rows-1][0]);
 >           // Add this panel to the FocusListener
 >         this.addFocusListener(this);
 >         fields[0][0].setText("Test");
 >     }
 >       // & --- Focus Listeners --- &
 >     public void focusLost(FocusEvent e) {
 >         JTextField gained = (JTextField) e.getOppositeComponent();
 > //        gained.setText("Gained focus");
 >          fields[0][0].setText("Test 2");
 >     }
 >      public void focusGained(FocusEvent e) {
 >         JTextField lost = (JTextField) e.getOppositeComponent();
 > //        lost.setText("Lost focus");
 >          fields[0][0].setText("Test 2");
 >     }
 > }
 >   men feltet fields[0][0] ændrer ikke tekst selvom der skiftes mellem de  
 > forskellige felter.
 >  Spørgsmålet er så - kan et JPanel anvendes som FocusListener (jeg kan  
 > ikke se hvorfor det ikke skulle kunne det)
 >  Håber nogle friske gutter og "gutinder" har svar på rede hånd.
 >   Mvh / Preben Holm
 
  
            
             |   |   
            
        
 
            
         
           Preben Holm (25-08-2004) 
         
	
            | Kommentar Fra : Preben Holm | 
  Dato :  25-08-04 13:05 |  
  |   
            
 
 
 Martin Husted Hartvig wrote:
 > Ikke at jeg vil løse dit problem, men måske har du overset at
 > 
 > Du laver en
 > 
 >>           // Add this panel to the FocusListener
 >>         this.addFocusListener(this);
 > 
 > 
 > Men hvad er der lige der giver dit panel fokus? Jeg tror ikke du 
 > virkelig  mener, at du vil teste for fokus på et panel.
 > 
 
 Jeg tror jeg har fundet fejlen  (som du pointerer der), men fatter bare 
 ikke hvorfor et eksempel jeg har læst faktisk virker? Men den tid den sorg.
 
 Hvis et af mine felter ikke har fokus får jeg en NullPointerException 
 (mener jeg) når jeg vælger det (måske fordi jeg forsøger at få fat i 
 getOppositeComponent()) og der måske faktisk ikke er noget component. 
 Det sker sjældent at feltet ikke har fokus fra starten af applikationen 
 men det sker jo. Hvorfor? og hvad kan jeg gøre for at slippe af med fejlen.
 
 
 Mvh / Preben Holm
  
            
             |   |   
            
        
 
            
         
            Preben Holm (25-08-2004) 
         
	
            | Kommentar Fra : Preben Holm | 
  Dato :  25-08-04 13:43 |  
  |   
            > Hvis et af mine felter ikke har fokus får jeg en NullPointerException 
 
 ups, en ClassCastException fremkommer.
 
 > (mener jeg) når jeg vælger det (måske fordi jeg forsøger at få fat i 
 > getOppositeComponent()) og der måske faktisk ikke er noget component. 
 > Det sker sjældent at feltet ikke har fokus fra starten af applikationen 
 > men det sker jo. Hvorfor? og hvad kan jeg gøre for at slippe af med fejlen.
 
 Flg. fejl fremkommer:
 
 java.lang.ClassCastException
 
    at 
 com.os.cladde.ui.finans.kladde.KassekladdePanel.focusGained(KassekladdePanel.java:202)
 
    at java.awt.AWTEventMulticaster.focusGained(AWTEventMulticaster.java:162)
 
    at java.awt.Component.processFocusEvent(Component.java:5003)
 
    at java.awt.Component.processEvent(Component.java:4888)
 
    at java.awt.Container.processEvent(Container.java:1569)
 
    at java.awt.Component.dispatchEventImpl(Component.java:3615)
 
    at java.awt.Container.dispatchEventImpl(Container.java:1627)
 
    at java.awt.Component.dispatchEvent(Component.java:3477)
 
    at 
 java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1713)
 
    at 
 java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:768)
 
    at 
 java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:453)
 
    at java.awt.Component.dispatchEventImpl(Component.java:3506)
 
    at java.awt.Container.dispatchEventImpl(Container.java:1627)
 
    at java.awt.Component.dispatchEvent(Component.java:3477)
 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
 
    at 
 java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
 
    at 
 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
 
 
 
 Problemet er vel, at der sker opstår et Focus-event når jeg vælger 
 feltet, men desværre kommer Focus ikke fra noget andet felt, hvilket 
 betyder, jeg får en CastException. Jeg caster til JComponent i 
 funktionerne - hvilke komponenter udover JComponent skulle kunne have 
 fokus?:
 
 
      // & --- Focus Listeners --- &
      public void focusLost(FocusEvent e) {
          JComponent gained = (JComponent) e.getOppositeComponent();
          if (gained != null && gained instanceof DataFelt);
              //((JTextField) gained).setText("Gained focus");
      }
 
      public void focusGained(FocusEvent e) {
          JComponent lost = (JComponent) e.getOppositeComponent();
          if (lost != null && lost instanceof DataFelt) {
              //((DataFelt) lost).setText("Lost focus");
              try {
                  ((DataFelt) lost).saveData();
              } catch (Exception exc) {
                  System.out.println(exc.getMessage());
              }
          }
      }
 
 
 
 Mvh / Preben Holm
  
            
             |   |   
            
        
 
            
         
             Martin Husted Hartvi~ (25-08-2004) 
         
	
            | Kommentar Fra : Martin Husted Hartvi~ | 
  Dato :  25-08-04 14:20 |  
  |   
            
 
 > funktionerne - hvilke komponenter udover JComponent skulle kunne have  
 > fokus?:
 
 
 Focus er awt relateret, så jeg vil tro du kan komme helt ned på  
 'Component', men prøv med e.getOppositeComponent().getClass().getName();  
 som det første i dine focusGained/focusLost
 
 
 Hilsen
 Martin
 
 
 
 
 
 
 On Wed, 25 Aug 2004 14:42:59 +0200, Preben Holm  
 <64bitNonoSPAMno@mailme.dk> wrote:
 
 >> Hvis et af mine felter ikke har fokus får jeg en NullPointerException
 >
 > ups, en ClassCastException fremkommer.
 >
 >> (mener jeg) når jeg vælger det (måske fordi jeg forsøger at få fat i  
 >> getOppositeComponent()) og der måske faktisk ikke er noget component.  
 >> Det sker sjældent at feltet ikke har fokus fra starten af applikationen  
 >> men det sker jo. Hvorfor? og hvad kan jeg gøre for at slippe af med  
 >> fejlen.
 >
 > Flg. fejl fremkommer:
 >
 > java.lang.ClassCastException
 >
 >    at  
 > com.os.cladde.ui.finans.kladde.KassekladdePanel.focusGained(KassekladdePanel.java:202)
 >
 >    at  
 > java.awt.AWTEventMulticaster.focusGained(AWTEventMulticaster.java:162)
 >
 >    at java.awt.Component.processFocusEvent(Component.java:5003)
 >
 >    at java.awt.Component.processEvent(Component.java:4888)
 >
 >    at java.awt.Container.processEvent(Container.java:1569)
 >
 >    at java.awt.Component.dispatchEventImpl(Component.java:3615)
 >
 >    at java.awt.Container.dispatchEventImpl(Container.java:1627)
 >
 >    at java.awt.Component.dispatchEvent(Component.java:3477)
 >
 >    at  
 > java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1713)
 >
 >    at  
 > java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:768)
 >
 >    at  
 > java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:453)
 >
 >    at java.awt.Component.dispatchEventImpl(Component.java:3506)
 >
 >    at java.awt.Container.dispatchEventImpl(Container.java:1627)
 >
 >    at java.awt.Component.dispatchEvent(Component.java:3477)
 >
 >    at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
 >
 >    at  
 > java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
 >
 >    at  
 > java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
 >
 >    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
 >
 >    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
 >
 >    at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
 >
 >
 >
 > Problemet er vel, at der sker opstår et Focus-event når jeg vælger  
 > feltet, men desværre kommer Focus ikke fra noget andet felt, hvilket  
 > betyder, jeg får en CastException. Jeg caster til JComponent i  
 > funktionerne - hvilke komponenter udover JComponent skulle kunne have  
 > fokus?:
 >
 >
 >      // & --- Focus Listeners --- &
 >      public void focusLost(FocusEvent e) {
 >          JComponent gained = (JComponent) e.getOppositeComponent();
 >          if (gained != null && gained instanceof DataFelt);
 >              //((JTextField) gained).setText("Gained focus");
 >      }
 >
 >      public void focusGained(FocusEvent e) {
 >          JComponent lost = (JComponent) e.getOppositeComponent();
 >          if (lost != null && lost instanceof DataFelt) {
 >              //((DataFelt) lost).setText("Lost focus");
 >              try {
 >                  ((DataFelt) lost).saveData();
 >              } catch (Exception exc) {
 >                  System.out.println(exc.getMessage());
 >              }
 >          }
 >      }
 >
 >
 >
 > Mvh / Preben Holm
 
  
            
             |   |   
            
        
 
            
         
              Preben Holm (25-08-2004) 
         
	
            | Kommentar Fra : Preben Holm | 
  Dato :  25-08-04 21:59 |  
  |  
 
            Martin Husted Hartvig wrote:
 > 
 > 
 >> funktionerne - hvilke komponenter udover JComponent skulle kunne have  
 >> fokus?:
 > 
 > 
 > 
 > Focus er awt relateret, så jeg vil tro du kan komme helt ned på  
 > 'Component', men prøv med 
 > e.getOppositeComponent().getClass().getName();  som det første i dine 
 > focusGained/focusLost
 Component virker    Laver nu blot en instanceOf();
 Jeg har dog stadig et mærkeligt fænomen. Når jeg starter min applikation 
 er det ikke altid mine felter bliver udfyldt (selvom der er data til 
 det). Jeg har udskrevet en masse "null" til standard out som må blive 
 kastet fra nogle exceptions et sted. Desuden virker tabbing slet ikke - 
 hvad går der dog galt? Hele applikationen virker faktisk ikke, men kun 
 ca. hver 10'ende gang jeg starter (fra BlueJ)!
 Mvh / Preben Holm
            
              |   |   
            
        
 
            
         
               Martin Husted Hartvi~ (26-08-2004) 
         
	
            | Kommentar Fra : Martin Husted Hartvi~ | 
  Dato :  26-08-04 08:37 |  
  |  
 
            Hvis din kode stadig er den "samme" som da du startede denne tråd, så  
 laver du et dobbelt array (private JTextField[][] fields;), men du har  
 ingen init af arrayet og de enkelte elementer. Dette kunne være grunden  
 til dine NullPointerExceptions, men for at kunne sige noget endeligt, så  
 skal du poste din kode.
 Hilsen
 Martin
 On Wed, 25 Aug 2004 22:58:49 +0200, Preben Holm  
 <64bitNonoSPAMno@mailme.dk> wrote:
 > Martin Husted Hartvig wrote:
 >>
 >>> funktionerne - hvilke komponenter udover JComponent skulle kunne have   
 >>> fokus?:
 >>    Focus er awt relateret, så jeg vil tro du kan komme helt ned på   
 >> 'Component', men prøv med  
 >> e.getOppositeComponent().getClass().getName();  som det første i dine  
 >> focusGained/focusLost
 >
 > Component virker    Laver nu blot en instanceOf();
 >
 > Jeg har dog stadig et mærkeligt fænomen. Når jeg starter min applikation  
 > er det ikke altid mine felter bliver udfyldt (selvom der er data til  
 > det). Jeg har udskrevet en masse "null" til standard out som må blive  
 > kastet fra nogle exceptions et sted. Desuden virker tabbing slet ikke -  
 > hvad går der dog galt? Hele applikationen virker faktisk ikke, men kun  
 > ca. hver 10'ende gang jeg starter (fra BlueJ)!
 >
 >
 > Mvh / Preben Holm
            
              |   |   
            
        
 
            
         
                Preben Holm (27-08-2004) 
         
	
            | Kommentar Fra : Preben Holm | 
  Dato :  27-08-04 17:37 |  
  |   
            > Hvis din kode stadig er den "samme" som da du startede denne tråd, så  
 > laver du et dobbelt array (private JTextField[][] fields;), men du har  
 > ingen init af arrayet og de enkelte elementer. Dette kunne være grunden  
 > til dine NullPointerExceptions, men for at kunne sige noget endeligt, 
 > så  skal du poste din kode.
 
 Jeg har initialiseret felterne. NULL opstod pga. jeg prøvede at 
 konveretere en dato som endnu ikke var sat.
 
 Jeg har ikke oplevet fejlen så meget i dag, med at felterne ikke bliver 
 fyldt ud i nogen tid nu, men jeg synes dog stadig det virker mærkeligt 
 at det sker sådan ca. 1 ud af 30 eller måske 50 gange. Der er ikke noget 
 "tidsafhængigt" i min kode. Der smides en gang testdata ind i 
 applikationen (den samme hver gang), men stadig ændres opførsel fra gang 
 til gang!
 
 Mvh / Preben Holm
  
            
             |   |   
            
        
 
            
         
                 Martin Husted Hartvi~ (30-08-2004) 
         
	
            | Kommentar Fra : Martin Husted Hartvi~ | 
  Dato :  30-08-04 09:58 |  
  |   
            On Fri, 27 Aug 2004 18:36:59 +0200, Preben Holm  
 <64bitNOnoSPAMno@mailme.dk> wrote:
 
 >> Hvis din kode stadig er den "samme" som da du startede denne tråd, så   
 >> laver du et dobbelt array (private JTextField[][] fields;), men du har   
 >> ingen init af arrayet og de enkelte elementer. Dette kunne være  
 >> grunden  til dine NullPointerExceptions, men for at kunne sige noget  
 >> endeligt, så  skal du poste din kode.
 >
 > Jeg har initialiseret felterne. NULL opstod pga. jeg prøvede at  
 > konveretere en dato som endnu ikke var sat.
 >
 
 Thjaa, sådan kan det jo gå ;)
 
 
 > Jeg har ikke oplevet fejlen så meget i dag, med at felterne ikke bliver  
 > fyldt ud i nogen tid nu, men jeg synes dog stadig det virker mærkeligt  
 > at det sker sådan ca. 1 ud af 30 eller måske 50 gange. Der er ikke noget  
 > "tidsafhængigt" i min kode. Der smides en gang testdata ind i  
 > applikationen (den samme hver gang), men stadig ændres opførsel fra gang  
 > til gang!
 
 
 Prøv med
 
          revalidate();
          repaint();
 
 på den komponent du sætter teksten i (ved focusGained/focusLost efter  
 teksten er indsat). Det lyder som om du ikke får refresh'et din gui.
 
 Hilsen
 Martin
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |