Double Buffering i transparency

Double Buffering i transparency
LA
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 13 lat
  • Postów:37
0

Niestety znowu potrzebuję Waszej pomocy:(
Stworzyłem klasę dziedziczącą z JButton i nadpisuję paintComponent żeby przy okazji zmienić wygląd przycisku. Wygląda to tak:

Kopiuj
 super.paintComponent(g);
Image of = this.createImage(getWidth(),getHeight());
Graphics2D g2 = (Graphics2D)of.getGraphics();
RenderingHints hints = new RenderingHints(
	      RenderingHints.KEY_ANTIALIASING,
	      RenderingHints.VALUE_ANTIALIAS_ON
	      );
g2.setRenderingHints(hints);
g2.setColor(getBackground());
Ellipse2D.Float e = new Ellipse2D.Float(0,0,getWidth(),getHeight());
g2.fill(e);
g.drawImage(of,0,0,null);

Niestety pojawiająca się elipsa wypełnia tło Image'a kolorem białym, a dla mnie jest konieczne, aby to tło było przezroczyste. Jak to zmienić? (Nie mogę pozbyć się Image bo w efekcie wszystkiego aplikacją tą jest Applet)
Z góry dzięki za pomoc

LA
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 13 lat
  • Postów:37
0

Poprawiłem to trochę i za pomocą BufferedImage otrzymałem przezroczysty obiekt, ale jest inny problem.
Wygląda to tak:
Mam na panelu 2 elementy: napis i przycisk. W tle działa wątek który zmienia im co pewien czas tło poprzez zwykłą operację object.setBackground(Color..). W nadpisanym obiekcie przycisku pojawia się oval ale ma on w tle kolor tła tego przycisku - jaki może być powód? To dokładnie wygląda jak w załączniku - zupełnie nie wiem o co chodzi.
Powinien być tylko ten żółty kolor na zmianę z jakimś innym, bez tego tła.

LA
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 13 lat
  • Postów:37
0

To jeszcze udało mi się zaobserwować (może komuś to coś podpowie i będzie w stanie mi pomóc).
To co pojawia się w tle to następstwo tego, że image jest przezroczysty i zbiera kolory z zupełnie innych kontrolek. Teraz pytane, czemu?
Dlaczego nie bierze tego co ma w tle jako kolor tylko element z jakiejś innej kontrolki?
Jeśli to coś komuś podpowie to mogę dosłać inne zrzuty i fragmenty kodu.

LA
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 13 lat
  • Postów:37
0

Udało mi się rozwiązać problem na innym forum, jeśli będzie ktoś kiedyś szukał odpowiedzi to:
zamiast Thread -> SwingWorker
koniecznie wywołać super.paint() czy też super.paintComponent() zależy co komu potrzebne.
Pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.