Witam. Nie znalazłem odpowiedzi na google. Czy można w SWT zrobić aplikację rysująca np. figury jak w paincie korzystajac i z MouseListenera i z PaintListenera? Nie wiem jak połączyć zdarzenia z MouseListener z PaintListener. Jest w ogóle taka możliwość, aby wpływać na funkcje paintControl()? Jeśli nie korzystam z PaintListenera, to narysuje np. obrazek, ale jak zjeżdżam rolką w dół to tam gdzie kończy się obramowanie to obrazek znika i się nie odrysowuje. Z PaintListener tego problemu nie ma, no ale jak wspomniałem wcześniej nie wiem jak to rozbudować, aby się repaintowało jak zaznaczę jakiś obraz myszką.
Odpowiedź na pytanie: da się. Wszystko się da, skoro w Swingu się da ;)
Twoja odpowiedź podniosła mnie na duchu i znalazłem sposób:) Dzięki, trochę za szybko postawiłem temat.
Pozwolę sobie odświeżyć temat. Bo mam problemy z podwójnym bufforowaniem. Otóż staram się to zrobić według tego tutoriala: http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/DoubleBuffer.htm . Z tego co rozumiem, przy pierwszym kroku jest wykonywane tak jakby zdjęcie tego co znajduje się na canvas. Niestety u mnie to nie działa. Obraz po prostu mruga przy rysowaniu w kółko tego samego obrazka (img). Czyli z tego co rozumiem nie pobiera w ogóle danych z canvas przy image2 = (Image) canvas.getData(); Oto kod:
canvas.addPaintListener(new PaintListener() {
private Image image2;
@Override
public void paintControl(PaintEvent arg0) {
image2 = (Image) canvas.getData();
if (image2 == null
|| image2.getBounds().width != canvas.getSize().x
|| image2.getBounds().height != canvas.getSize().y) {
image2 = new Image(
canvas.getDisplay(),
canvas.getSize().x,
canvas.getSize().y);
canvas.setData(,image2);
}
GC imageGC = new GC(image2);
imageGC.setBackground(gc.getBackground());
imageGC.setForeground(gc.getForeground());
imageGC.setFont(gc.getFont());
Rectangle imageSize = image2.getBounds();
imageGC.fillRectangle(0, 0, imageSize.width + 1, imageSize.height + 1);
//tutaj rysowanie mojego obrazka
gc.drawImage(img, 0, 0);
//----------------------------
gc.drawImage(image2, 0, 0);
imageGC.dispose();
canvas.redraw();
canvas.getDisplay().timerExec(100, new Runnable() {
public void run() {
canvas.redraw();
}
});
}
});
Nie wiem gdzie robię błąd. Proszę o pomoc.
Nie chce mi sie analizowac tego kodu, ale powinno byc tak:
- rysujesz wszystko, co chcesz w pamieci
- kopiujesz na ekran
- idziesz do kroku pierwszego ;) (czyli robisz to w kolko)
Innymi slowy, jesli chcesz miec dwa bufory:
- rysujesz na buforze 1
- przerysowujesz go na ekran
- zamieniasz bufory
- rysujesz na buforze 2
- przerysowujesz go na ekran
- zamieniasz bufory
- i znow punkt 1 (i tak w kolko)
No niestety nie mogę coś tego ogarnąć. Wytłumaczenie jak najbardziej zrozumiałe. Wydaje mi się, że kod jest jak najbardziej poprawny, no ale niestety kiedy ruszam myszką to obraz cały czas miga i na dodatek wszystkie kwadraty rysują się na ciemno szary, gdzie przed ich odrysowywaniem daje kolor czerwony:
public void paintControl(PaintEvent e) {
Image image2 = new Image(display,image1.getImageData());
GC imageGC = new GC(image2);
imageGC.setBackground(e.gc.getBackground());
imageGC.setForeground(e.gc.getForeground());
imageGC.drawImage(image2, 0, 0);
System.out.println(imageGC.getBackground());
Color c1 = new Color(display,255,0,0);
imageGC.setBackground(c1);
imageGC.setForeground(c1);
System.out.println(imageGC.getBackground());
if(selButtonsList.size()>0){
for(int i = 0; i < figurelist.size(); i++){
System.out.println(imageGC.getBackground());
imageGC.drawRectangle(koordynaty);
}
}
c1 = new Color(display,0,255,0);
imageGC.setBackground(c1);
imageGC.setForeground(c1);
if(this.figure!=null)
imageGC.drawRectangle(koordynaty);
gc.drawImage(image2, 0, 0);
imageGC.dispose();
}
No nie mogę znaleźć rozwiązania. Proszę o pomoc.
Problem rozwiązany. Dla tych, którzy będą mieli podobny problem to wyjaśniam, że komponent do którego dodajemy paintlistenera należy zadeklarować z SWT.NO_BACKGROUND. W moim przypadku Canvas canvas = new Canvas(scrolledComposite, SWT.NO_BACKGROUND);