2017-03-07 9 views
1

Ich habe ein seltsames Problem - nicht sicher, ob es einen Codierungsfehler oder einen Fehler in CN1 gibt.Warum ist in CodenameOne ein Kontrollkästchen nicht ausgewählt, aber ausgewählt?

Grundsätzlich erstelle ich eine Reihe von CheckBox-Objekten und lege sie in einen Container, der X-Scrollable ist. Wenn ich auf ein nicht ausgewähltes Element klicke und ziehe, bis der "elastische" Effekt es zurückzieht, scheint es ausgewählt zu sein, aber der Code zeichnet es nicht als ausgewählt auf.

Bitte beachten Sie das folgende Video von der Ausgabe: https://youtu.be/EtputE1kjyo

Beachten Sie, dass in der Konsole ausgegeben, das Wort ‚ausgewählt‘ werden aktiviert, wenn das Feld ausgewählt und Klein wurde, wenn es nicht ausgewählt ist. Gleiches für den Fokus (Ich habe der Ausgabe Fokus hinzugefügt, um festzustellen, ob setFocusable() wie gewünscht funktioniert hat, so dass der Fokus nicht für den Auswahlfehler verantwortlich war).

hier ist die Checkbox Erstellungscode:

cb = new CheckBox(getCacheableImageMaxHeight(mod.getIconFile(),moduleImageHeight)); 
cb.setName(mod.getModuleID()); 
cb.setToggle(true); 
cb.setUIID("ModuleButton"); 
cb.setFocusable(false); 
cb.setScrollVisible(false); 
cb.setTextPosition(Component.BOTTOM); 
cb.setCloudDestinationProperty(cb.getName()); 

//actionlistener added for debugging only 
final CheckBox cbFinal = cb; 
final String modName = mod.getDisplayName(); 
cb.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
     System.out.println(modName+", "+(cbFinal.isSelected()?"SELECTED":"selected") + ", " + (cbFinal.hasFocus()?"FOCUS":"focus")); 
    } 
}); 
c.addComponent(cb); 

UPDATE: Ich habe erkannt, zwei „Zustände“ im Krieg dort befinden sich hier: Die ToggleButtons (Ich weiß, jetzt sind sie, da ich nicht nur Checkboxen Set "SetToggle (true)) bleiben beim Drücken und Loslassen mit dem" elastischen "Effekt im" gedrückten "Zustand hängen. Leider haben die" gedrückten "und" ausgewählten "Zustände das gleiche Aussehen, so dass meine Benutzer denken Sie haben etwas ausgewählt, wenn es während eines Ziehvorgangs nur "gedrückt" wird.

Hier ist noch mehr Debugging, das ich getan habe.
Pressed AND Selected!

  • Die erste Taste gedrückt wird, aber (die Fehler) nicht ausgewählt.
  • Die zweite Schaltfläche ist normal ausgewählt und zeigt den Fehler nicht an.
  • Die dritte Schaltfläche ist interessant, weil ich sie ausgewählt, dann gezogen und freigegeben habe, um sie AUSGEWÄHLT und GEPRESSEN zu bekommen!

Also die Frage Änderungen: Gibt es einen offenen Fehler für diese Situation bereits (Gedrückt Zustand auf, nachdem klemmt Taste losgelassen wird) und wenn ja, ist es ein Update kommt oder eine Abhilfe für jetzt?

+0

Ich denke, es ist, weil 'CheckBox' eingestellt ist, um als' ToggleButton' zu fungieren, und Ihr Klicken zum Ziehen für das Scrollen bleibt ein bisschen zu lang. – Diamond

Antwort

0

Also habe ich eine effektivere Problemumgehung, die nicht über einen separaten Press Stil beinhalten nicht das Hinzufügen (da könnte es Tasten ausgewählt werden, gedrückt und ausgewählt + mit dem Bug gedrückt)

Ich brauchte das Ereignis zu erfassen Das Scrollen wurde gestoppt und der Status der Tasten überprüft, um sicherzustellen, dass keine Taste gedrückt wurde. Um dies zu tun, habe ich addPointerReleasedListener auf dem Scroll-Container verwendet, um zu erkennen, wenn der Zeiger abkam (so dass seine Komponenten definitiv nicht mehr gedrückt werden), und dann in seinem Runnable, stelle ich sicher, dass jeder freigegeben ist.

scrollingContainer.addPointerReleasedListener(evt -> { 
    Container cont = (Container) evt.getComponent(); 
    Iterator<Component> buttons = cont.iterator(); 
    while (buttons.hasNext()){ 
     Button button = (Button) buttons.next(); 
     if (button.getState() == Button.STATE_PRESSED) { 
      button.released(); 
     } 
    } 
}); 

Bis jetzt scheint das Problem zu lösen.Jetzt brauchen wir nur eine dauerhafte Lösung oder einen Hinweis in der Dokumentation von ToggleButtons, dass sie sich, wenn sie sich in einem Scroll-Container befinden, in einem gedrückten Zustand stecken bleiben und freigegeben werden müssen.

0

Wählen Sie einfach den ausgewählten Zustand anders als den gedrückten Zustand und es sollte gut funktionieren.

In einem Touch-Gerät wird der ausgewählte Zustand nicht wiedergegeben, wenn der Finger oben ist. Dies ist fast immer der Fall, es sei denn, Sie haben eine Markierung in Display geändert oder ein arkanes Thema konstant gesetzt.

+0

Ich denke, das ist eine Problemumgehung, obwohl ich würde wahrscheinlich "gedrückt", um wie "nicht ausgewählt" aussehen, so dass es nicht verwirrend (einige Elemente würden ausgewählt aussehen und andere würden gedrückt aussehen, sie zu verwirren ...). Das würde bedeuten, dass dem Benutzer kein visuelles Feedback darüber angezeigt wird, wann etwas gedrückt wird. Ich habe meine eigene Problemumgehung gefunden, die ich posten werde, aber ich hoffe, dass dies tatsächlich als Fehler angesehen wird und angesprochen werden sollte ... sollte ich hinzufügen ein Fehler im Projekt? –

+0

Nein. Es ist anders herum. Gepresst sollte ein gepresstes Aussehen haben, ausgewählte ist offener für Interpretationen. Ich bin mir nicht sicher, ob ich hier einen Fehler sehe. –

+0

Der Fehler ist meiner Meinung nach, dass nach dem Anheben meines Fingers der Knopf noch in einem gedrückten Zustand ist. Wenn das kein Fehler ist, können Sie mir bitte helfen, zu verstehen, wann ich dieses Verhalten verwenden würde? Vielleicht versuche ich die Umschalttasten falsch zu benutzen? –

Verwandte Themen