Avatar billede faceorbit Nybegynder
11. juni 2001 - 19:35 Der er 4 kommentarer og
1 løsning

JComboBox og focusLost

Jeg kan ikke få min focusLost implementering til
at virke på JComboBox :(

public class FocusControler
    implements FocusListener {

public FocusControler() {
    // AView() opretter og initialiserer
    // en række componenter
    AView aView = new AView();
    this.aView.aComboBox.addFocusListener(this);
    this.aView.aTextField.addFocusListener(this);

public void focusLost(FocusEvent e) {
    Object source = e.getSource();

    // virker ikke???
    if (source.equals(this.aView.aComboBox))
        System.out.println(\"aComboBox lost focus\");

    // virker
    if (source.equals(this.aView.aTextField))
        System.out.println(\"aTextField lost focus\");
}

Det virker som om det kun er et problem for
ComboBox\'en -- de andre komponenter er der
ingen problemer med. Focus bliver styret i
FocusControler og altså ikke i aView.
Avatar billede logical Nybegynder
11. juni 2001 - 21:09 #1
Hvis de to linier her står efter hinanden:

AView aView = new AView();
this.aView.aComboBox.addFocusListener(this);

Så laver du en aView i første linie, og derefter referer til en anden aView, nemlig en attribut i klassen selv, er det meningen ?

Det er formodentlig en clipping fejl :-)

Men, et ordentligt svar...

Det er umuligt at traversere fokus til en JComboBox. Hvis du kigger på metoden isTraversable (fra JComponent), så returnerer den false. Det betyder, at en JComboBox ikke vil modtage fokus, og derved heller ikke events.

Men hov, siger du så, det ser da sådan ud. Ja, men det skyldes at dit fokusevent bliver videredelegeret til det objekt, som er inde i JCOmboBox\'en, nemlig enten et JTextField eller en EditorComponent. Da de klasser er lidt forskellige (og man kan gøre næsten fuldstændig som man har lyst med UI til JComboBox), er det umuligt at få det her fokusevent ud fra din JComboBox (Eller ihvertfald umuligt hvis det skal virke overalt).

Det bedste du kan gøre er at finde den komponent, som der tabbes fra, evt. kalde setNextFocusableComponent(JComponent) på den med din JComboBox, og derefter fange focusLost(FocusEvent) fra den. Dette repeteres så med den næste komponent i forhold til din JComboBox, dvs. setNextFocusableComponent(JComponent) og fang FocusGained(FocusEvent).

Det blev jeg nødt til sidst.
Avatar billede faceorbit Nybegynder
12. juni 2001 - 08:56 #2
Skulle have været en klasse variable:
private AView aView = new AView();

logical: Combo boxen er den sidste komponent
på et panel på en tabbed pane. Når den mister fokus
skal der skiftes til en ny pane, eks:

// on combo box focus lost
aTabPane.setSelectedIndex(aTabPane.indexOfTab(\"nextPane\");
aButton.requestFocus();

Derfor kan jeg ikke bruge dit lille trix :(
Jeg har så selvfølgelig tænkt på at placere en
usynlig komponent lige efter, før eller ovenpå,
men ideen tiltaler mig ikke (øv øv øv), der må
da være en pæn måde at gøre det på??

Avatar billede faceorbit Nybegynder
12. juni 2001 - 10:12 #3
logical: Jeg tager det tilbage.
løsningen blev

// combo box på næste tabbed pane
// set next focus to nextComboBox
aView.nextComboBox.getComponent(0).addFocusListener(this);

// when next combo box gains focus
aTabPane.setSelectedIndex(aTabPane.indexOfTab(\"nextPane\");
nextComboBox.getComponent(0).requestFocus();

Du siger det er umuligt at få dette til at virke overalt?
Vil det sige at jeg ikke kan regne med at de forskellige
PLAF implementere combo box som en samling af JComponent\'s?




Avatar billede logical Nybegynder
12. juni 2001 - 16:22 #4
Der kan laves en del besynderligheder, når man skal lave en JComboBox, så derfor kan det blive en smule kompleks, men det jeg ved af det er følgende:

Generelt set, så har en JComboBox en Renderer og en Editor. Hvis en JComboBox er editable, så er det editoren, som bliver brugt som komponent i nærheden af en evt. pil, ellers bruges Renderen. Så hvis du har en editable JCombobox, vil du typisk finde den component, som får fokus ved at sige:
comboBox.getEditor().getEditorComponent()

Men det gælder ikke hvis din comboBox ikke er editable, så burde det være renderen, som er fokuskomponent. Men jeg er ikke helt sikker på, at det altid er sådan, uden at kunne egentlig forklare nærmere.
Avatar billede logical Nybegynder
20. juni 2001 - 20:52 #5
Jeg kan trøste dig med at fokus kontrol i jdk1.4 er omskrevet, så det rent faktisk vil kunne lade sig gøre at gøre en combobox deterministisk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester