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).
Unerwünschtes Verhalten
JSplitPane
so angepasst, dass nur das obere Panel sichtbar ist 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.
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 ...
Nicht genau, was scrollRectToVisible () macht.
Sie können möglicherweise die Methode JViewport.setViewPosition(...)
verwenden.
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%Tags und Links java swing jtable jsplitpane