Java: Jak narysować nakładkę bez przewijania w widoku ScrollPane?

Chciałbym użyć ScrollPane do wyświetlenia obrazu w jego rzutni, a także mieć nałożoną na obraz siatkę (lub pole lub dowolny inny znacznik rejestracji / lokalizacji). Potrzebuję nakładki, aby pozostała stała podczas przewijania (co oznacza, że ​​obraz porusza się „pod” nakładką). Będę przewijał widok w rzutni ze stałą szybkością, aby zapewnić płynny ruch, a nakładka ma zapewnić odniesienie do określonej lokalizacji w rzutni. Pojęciowo pomyśl o dużej mapie przewijającej się w rzutni, a rzutnia o prostokącie, który się nie porusza (w stosunku do samej rzutni), która oznacza region, który można powiększyć w oparciu o jakąś akcję użytkownika.

Zakładam (ale jeszcze nie potwierdziłem), że implementacja ScrollPane efektywnie obsługuje renderowanie Widoku (z magazynu kopii zapasowej, bez konieczności ponownego malowania całego Widoku (lub nawet ViewPort) dla każdej nowej ekspozycji częściowej) i dlatego wolałaby nie Zastąp metodę paint ().

Patrzyłem na LayerPane i chociaż nie opanowałem go, wydaje się, że jest to podejście brutalne. ScrollPane jest jednym ze składników SplitPane i zostanie przeniesiony / zmieniony. Spodziewam się, że musiałbym ręcznie utrzymywać poprawną relację między ViewPort a LayerPane przy użyciu pozycjonowania bezwzględnego. Jestem daleko od eksperta w projektowaniu i implementacji GUI i jestem pewien, że brakuje mi możliwości, od oczywistych do niejasnych i eleganckich, o których wiedziałaby doświadczona osoba.

Jestem otwarty na wszelkie sugestie, nie tylko ścieżkę, którą zacząłem. Czy powinienem (mogę) dodać JPanel jako jeden komponent w moim SplitPane, a następnie dodać LayerPane do tego zawierającego mój ScrollPane i nakładkę (inną JPanel) na różnych warstwach na LayerPane? Czy istnieje funkcja ScrollPane, która obsługuje to bezpośrednio? Przeglądałem samouczki Java Swing i dokumentację API, ale jeszcze niczego nie widziałem.

Dzięki.

AKTUALIZACJA:

Dziękuję za link, trashgod. Było to znacznie łatwiejsze niż się spodziewałem. Nie ma potrzeby tworzenia LayerPane, GlassPane, kompozycji opartej na Xor ... Nie wiem, dlaczego nie przyszło mi do głowy, aby spróbować przesłonić JViewport.paint (), aby narysować moją nakładkę - ale z poniższym kodem sprawdziłem poprawność koncepcji daj mi to, czego szukam. Po prostu użyj podklasy JViewport i zrobi to, co chciałem (w tym przypadku nałożenie prostokąta na środek rzutni podczas przewijania obrazu poniżej). Nie jestem ekspertem od GUI, a Java API jest niewiarygodnie szeroki; Nie mam pojęcia, jak trzymacie to wszystko w głowie - ale dzięki!

<code>class MyViewport extends JViewport {
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(Color.BLACK);
        g2.drawRect(getWidth()/4,getHeight()/4,getWidth()/2,getHeight()/2);
    }
}
</code>

questionAnswers(1)

yourAnswerToTheQuestion