/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
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

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408182
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste