Das JComboBox-Popup erscheint und wird sofort ausgeblendet, wenn auf den Rand geklickt wird (Schlechte Benutzererfahrung)

8

Wenn Sie eine JComboBox schwingen und auf ihren Rand klicken, wird das Popup angezeigt und verschwindet sofort. Wenn ich "Klick" sage, meine ich, drücke den linken Knopf der Maus und lasse sie sofort los.

Es kann als eine schlechte Benutzererfahrung angesehen werden, da kein Benutzer erwarten würde, dass dies geschieht. Jeder Benutzer würde eines der folgenden Verhaltensweisen erwarten, wenn er auf einen Rahmen einer Combobox klickt:

  1. Das Popup zum Öffnen und Öffnen bleibt geöffnet,
  2. Oder es überhaupt nicht zu öffnen.

Sicherlich würde kein Benutzer erwarten, dass das Popup sofort geöffnet und geschlossen wird.

Der Benutzer klickt nicht absichtlich auf den Rand. Aber es kann häufig vorkommen, wenn die Combobox klein ist und er versucht, schnell darauf zu klicken.

Im Jahr 2000 registrierte jemand dieses Verhalten als Fehler in openjdk: Ссылка

Sie haben es als einen Fehler erkannt, aber geschlossen mit der Auflösung: "Nicht reparieren", mit der folgenden Beobachtung:

  

Ich konnte das Problem reproduzieren, aber es ist nicht so wichtig   Ich werde es nicht reparieren. Das Problem ist, dass der Drop-Down-Teil von   Das Kombinationsfeld wird ausgeblendet, wenn die Maus nach dem Anklicken losgelassen wird   die Grenze. Dieser Fehler hat keine sehr großen Auswirkungen.

Ich stimme ihnen zu, dass es keine großen Auswirkungen hat. Aber ich denke immer noch, dass dies zu einer schlechten Benutzererfahrung führt und ich würde gerne wissen, ob es eine einfache Lösung gibt, das Popup entweder geöffnet zu lassen oder gar nicht zu öffnen, wenn der Benutzer auf seinen Rahmen klickt.

Das beschriebene Verhalten kann durch Klicken der linken Maustaste auf den Rand einer beliebigen JComboBox reproduziert werden. Siehe unten einen einfachen Code, wo es reproduziert werden kann:

%Vor%     
viniciussss 09.12.2016, 14:44
quelle

2 Antworten

5

Das Problem scheint darin zu liegen:

%Vor%

Indem Sie eins von size.width und size.height subtrahieren, fällt die Maus außerhalb der Grenzen der Pfeilschaltfläche und das Popup-Menü ist ausgeblendet.

Die Behebung des Problems ist problematisch. Die Klasse Handler ist private , also können wir sie nicht erweitern, denn getHandler() ist private , also können wir das auch nicht in BasicComboPopup überschreiben.

Man könnte MetalComboBoxUI verlängern und createPopup() überschreiben, um eine benutzerdefinierte ComboPopup zurückzugeben, zB eine Erweiterung BasicComboPopup , aber eine Erweiterung createMouseListener() , um eine ähnliche Klasse wie oben Handler zurückzugeben, aber ohne die Subtraktion Einsen.

Oh, und mach dasselbe für jeden LAF, den du unterstützen willst. Yuk.

Wenn Sie das Problem aus der anderen Richtung angreifen, können Sie MetalComboBoxButton (das von e.getSource() zurückgegeben wird) erweitern und die getSize() -Methode überschreiben, um eine um ein Pixel größere Dimension in beide Richtungen zurückzugeben, wenn das Menü angezeigt wird . Natürlich müssen Sie das MetalComboBoxUI noch erweitern und überschreiben, um diese benutzerdefinierte Schaltfläche zu erstellen und zu installieren.

Und wieder müssen Sie für jeden LAF, den Sie unterstützen möchten, dasselbe tun. Wieder, Yuk.

Leider scheint Swing nicht über die erforderlichen Hooks zu verfügen, um die benötigten Funktionen leicht außer Kraft zu setzen, und hat verschiedene Klassen als private interne Implementierungsdetails gekennzeichnet, um deren Wiederverwendung zu verhindern (um später Brüche zu vermeiden, wenn sie die Interna ändern wollen) ).

    
AJNeufeld 13.12.2016, 17:00
quelle
1

AJNeufelds Vorschlag funktionierte perfekt. Danke!

Unten ist der Code, wenn jemand es braucht.

JComboBoxGoodBorder.java:

%Vor%

Test.java:

%Vor%     
viniciussss 17.12.2016 01:24
quelle