Double Buffering i transparency

Odpowiedz Nowy wątek
2011-07-26 14:26
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:

 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

Pozostało 580 znaków

2011-07-27 10:46
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.

Pozostało 580 znaków

2011-07-27 11:48
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.

Pozostało 580 znaków

2011-07-27 13:58

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0