SWT rysowanie

0

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ą.

1

Odpowiedź na pytanie: da się. Wszystko się da, skoro w Swingu się da ;)

0

Twoja odpowiedź podniosła mnie na duchu i znalazłem sposób:) Dzięki, trochę za szybko postawiłem temat.

0

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.

0

Nie chce mi sie analizowac tego kodu, ale powinno byc tak:

  1. rysujesz wszystko, co chcesz w pamieci
  2. kopiujesz na ekran
  3. idziesz do kroku pierwszego ;) (czyli robisz to w kolko)

Innymi slowy, jesli chcesz miec dwa bufory:

  1. rysujesz na buforze 1
  2. przerysowujesz go na ekran
  3. zamieniasz bufory
  4. rysujesz na buforze 2
  5. przerysowujesz go na ekran
  6. zamieniasz bufory
  7. i znow punkt 1 (i tak w kolko)
0

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.

0

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);

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