|
| 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
| |
|
|