JTable # scrollRectToVisible zeigt in Kombination mit JSplitPlane die falsche Zeile an

8

Wenn ich JTable#scrollRectToVisible aufruft, ist die Zeile, die ich anzeigen möchte, in bestimmten Situationen unter der Kopfzeile verborgen.

Der Rest dieser Frage ist nur sinnvoll, wenn Sie den folgenden Code verwenden. Dies ist ein sehr einfaches Programm, mit dem ich das Problem illustriere. Es zeigt eine UI mit JSplitPane , im oberen Teil einige Schaltflächen, und der untere Teil enthält JTable in JScrollPane (siehe Screenshots am Ende dieses Posts).

%Vor%

Unerwünschtes Verhalten

  • Führen Sie den obigen Code
  • aus
  • Drücken Sie die "Select row 10": Zeile 10 ist ausgewählt und sichtbar
  • Drücken Sie die "Zeile 45 wählen": Zeile 45 ist ausgewählt und sichtbar
  • Klicken Sie auf die Schaltfläche "Unten ausblenden". Dadurch wird der Teiler von JSplitPane so angepasst, dass nur das obere Panel sichtbar ist
  • Klicken Sie auf die Schaltfläche "Zeile 10 auswählen". Du siehst natürlich nichts weil die Tabelle noch nicht sichtbar ist
  • Klicken Sie auf die Schaltfläche "Zeige unten". Der Teiler ist eingestellt, aber Zeile 10 ist unter dem Header versteckt. Ich habe erwartet, dass es sichtbar ist, ohne scrollen zu müssen.

Gesuchtes Verhalten

Wiederholen Sie die oben beschriebenen Schritte, aber stellen Sie sicher, dass das Kontrollkästchen "Tabelle vor dem Anpassen des Teilers unsichtbar machen" aktiviert ist. Dies ruft setVisible(false) in JScrollPane um JTable auf, bevor das untere Feld ausgeblendet wird.

Dadurch wird im letzten Schritt Zeile 10 als oberste Zeile sichtbar, was ich möchte. Ich möchte den Scrollpanel nicht unsichtbar machen : In meiner realen Anwendung wird der Teiler animiert und Sie möchten die Tabelle während der Animation sichtbar halten.

Screenshots

Unerwünscht : Zeile 10 ist nach Ausführung der oben genannten Schritte nicht mehr sichtbar

Gesucht : Zeile 10 ist nach Ausführung der oben genannten Schritte sichtbar.

Umgebung

Ich glaube nicht, dass es etwas ausmacht, aber nur für den Fall: Ich benutze JDK7 auf einem Linux-System.

    
Robin 05.08.2015, 13:37
quelle

2 Antworten

3

Dies scheint durch die Art und Weise verursacht zu werden, wie die JViewport die scrollRectToVisible behandelt, wenn die Größe kleiner ist als das gewünschte Rechteck. Es enthält einen (etwas unscharfen, aber wahrscheinlich verwandten) Kommentar in den JavaDocs:

  

Beachten Sie, dass diese Methode nicht außerhalb des gültigen Ansichtsfensters blättert. Wenn beispielsweise contentRect größer ist als das Ansichtsfenster, wird das Scrollen auf die Grenzen des Ansichtsfensters beschränkt.

Ich habe den kompletten Code nicht durchgegangen, habe die ganze Mathematik gemacht und alle Fälle überprüft. Also eine Warnung : Die folgenden Erklärungen enthalten ganz ähnliche Handbewegungen. Aber eine vereinfachte Beschreibung dessen, was das für mich in diesem speziellen Fall bedeutet:

Wenn der untere Teil ausgeblendet wird (durch entsprechende Einstellung der Teilerposition), ist diese Höhe von JScrollPane und JViewport gleich 0. Wenn Sie nun scrollRectToVisible mit einem Rechteck anfordern, das eine Höhe von 20 (für eine Tabellenzeile, als Beispiel), dann wird es bemerken, dass dies nicht passt. Abhängig von der aktuellen Ansichtsposition von JViewport kann dies dazu führen, dass das Ansichtsfenster gescrollt wird, sodass das untere dieses Rechtecks ​​sichtbar ist.

(Sie können dies beobachten: Ziehen Sie die Teilerstelle manuell , so dass ungefähr Hälfte einer Tabellenzeile sichtbar ist. Wenn Sie auf die Schaltfläche "Zeile 45 auswählen" klicken, die obere Hälfte der Zeile ist sichtbar Wenn Sie auf die Schaltfläche "Select row 10" klicken, wird die untere Hälfte der Zeile angezeigt

Eine pragmatische Lösung, die hier für mich zu funktionieren schien, war sicherzustellen, dass sie immer scrollt, so dass das obere des Rechtecks ​​sichtbar ist (selbst wenn das Rechteck überhaupt nicht in das Rechteck passt) Ansichtsfenster!). So:

%Vor%

Aber ich kann nicht versprechen, dass dies den gewünschten Effekt für dich hat, wenn eine Animation ins Spiel kommt ...

    
Marco13 05.08.2015, 22:46
quelle
2

Nicht genau, was scrollRectToVisible () macht.

Sie können möglicherweise die Methode JViewport.setViewPosition(...) verwenden.

%Vor%

In diesem Fall wird die ausgewählte Zeile immer am oberen Rand des Ansichtsfensters angezeigt (wenn möglich). Das Bildfenster wird also immer scrollen, es sei denn, die ausgewählte Zeile ist aktuell oben. Wenn Sie diese Methode verwenden, wenn sich die erste Zeile oben im Ansichtsfenster befindet und Sie die 10. Zeile auswählen, wird im Ansichtsfenster die oberste Zeile angezeigt.

Dieses Verhalten unterscheidet sich jedoch etwas von der Verwendung der scrollRectToVisible () -Methode. Wenn Sie die scrollRectToVisible () -Methode verwenden, wird das Ansichtsfenster nur gescrollt, wenn sich das Rechteck nicht im sichtbaren Teil des Ansichtsfensters befindet. Wenn Sie diese Methode verwenden, wenn sich die erste Zeile oben im Ansichtsfenster befindet und Sie die 10. Zeile auswählen, wird das Ansichtsfenster NICHT gescrollt, da die 10. Zeile bereits im Ansichtsfenster angezeigt wird.

Ich weiß nicht, ob diese Änderung der Funktionalität akzeptabel ist oder nicht.

Hinweis: Wenn Sie nicht möchten, dass das Ansichtsfenster automatisch scrollt, wenn Sie eine Zeile auswählen, können Sie Folgendes versuchen:

%Vor%     
camickr 05.08.2015 20:48
quelle

Tags und Links