11. juni 2001 - 19:35Der 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.
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).
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å??
// 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?
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.
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
Synes godt om
Ny brugerNybegynder
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.