2013-03-15 12 views
5

W mojej aplikacji wyświetlam okno dialogowe z dużą listą kart. Wyświetlam je jako obrazy w wielu komponentach JLabel w podklasie JPanel. Następnie umieściłem ten obiekt w JScrollPane, aby umożliwić poziome przewijanie kart.JScrollPane z przezroczystym tłem i zawartością

Chcę, aby niewykorzystane miejsce było przezroczyste z ciemnym tłem, aby pokazać, że to, co za nim jest, jest wyłączone. Użyłem setBackground(new Color(50, 50, 50, 200)), aby uzyskać pożądany wygląd, ale zawartość za nim nie przerysowuje, więc otrzymuję artefakty.

Oto jak to wygląda:

Artifacting when scrolling

Jak przejść o ustalenie to? Jak mogę uzyskać zawartość za nią, aby przerysować po przewinięciu?

Z góry dziękuję.

Odpowiedz

6

Wyciągnięcie okna z równania dla momement.

JScrollPane zawiera JViewport, który zawiera treść. Musisz więc ustawić okienko zawartości na przezroczyste, okno robocze na przezroczyste, a następnie przezroczyste.

Możesz to osiągnąć, używając setOpaque(false) na każdym z tych pojemników.

Zapewni to, że menedżer odmalowania będzie teraz malować w tle.

Kolejny problem polega na tym, że Swing nie obsługuje elementów "półprzezroczystych" (to znaczy, że są nieprzezroczyste lub przezroczyste).

można zaimplementować to poprzez nadpisanie metody głównego składnika paintComponent (jeden na rzutni jest prawdopodobnie wystarczająca)

+0

Dobre połączenie w 'JViewport'. Nie wiedziałem, że istnieje. Użyłem kombinacji obu odpowiedzi, aby to naprawić. – MaxGhost

1

Spróbuj następujących ... może dać ulgę podczas przewijania. Prawdopodobnie masz również problem, gdy główna ramka jest zmaksymalizowana lub przywrócona. Będziesz potrzebował detektora dla tych zdarzeń i podobnej poprawki.

jScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
    jScrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
+0

Dzięki. Użyłem kombinacji obu odpowiedzi, aby to naprawić. – MaxGhost

Powiązane problemy