SWT probleme beim einbinden von Images

crazyharry89

Mitglied
Halli Hallo,
ich muss gerade eine Anwedung programieren, mit der man den Text, der auf einem Image steht
auslesen kann. Dies nur für eure Kenntnis.
Ich stehe aber nun noch ziemlich am Anfang und habe deahlb erst einmal 2 Fragen.

Frage1:

Meine shell ist in eine Linke Seite und eine Rechte Seite durch einen Sash unterteilt.
Beim start öffnet es ein neuen FileDialog und ich kann das Image auswählen.
Dies wird dann auf der rechten Seite in einem Canvas angezeigt. Nun meine Frage.
Gibt es eine Möglichkeit, das Bild mit dem Sash zu skalieren.
Anders gesagt, ich möchte, dass mein Bild kleiner wird,
wenn ich den Sash in Richtung des Images schiebe und größer wenn er sich davon entfernt.
Bisher ist es so geregelt, das ein ScrollBar erscheint, wenn ich den Sash ins Fenster hinein Bewege.
Für eine bessere Usability muss es jetzt über die Skalierung gehandhabt werden.

Frage2:

Bei dem Projekt geht es darum, Anträge und so zu digitalisieren und zu Überprüfen. Da so ein Antrag
ja auch aus mehreren Seiten Besteht, müsste ich auch mehrere Seiten in das Canvas laden.
Diese sollen dabei einfach untereinander aneinander gereit werden. Bei diesem Thema habe ich
allerdings nicht einmal ein Ansatz. Wie lade ich mehrere Bilder in das Canvas?

Hier mal der Code der bis jetzt verwendet wird:
(Der vertikale Scrollbalken ist bereits auskommentiert, da ich ihn ja theoretisch nicht mehr brauche,
wenn das Bild skalliert wird)
Java:
SashForm sashForm = new SashForm(shell, SWT.HORIZONTAL);
			sashForm.setVisible(true);
		
				Composite linkeSpalte = new Composite(sashForm, SWT.None);
				linkeSpalte.setLayout(new FillLayout(SWT.NONE));
				linkeSpalte.setBackground(new Color(display, 31, 133, 31));
				//Bild laden
				
				Image orginalImage = null;
				FileDialog FD = new FileDialog(shell, SWT.NONE);
				FD.setText("Pfad angeben");
				String string = FD.open();
				
				if (string != null)
					{
						orginalImage = new Image(display, string);
					}
				if (string == null)
					{
						int width = 150, height = 200;
						orginalImage = new Image (display, width, height);
						GC gc = new GC (orginalImage);
						gc.fillRectangle(0, 0, width, height);
						gc.drawLine(0, 0, width, height);
						gc.drawLine(0, height, width, 0);
						gc.drawText("Image not FOUND", 0, 0);
						gc.dispose();
					}
				final Image image = orginalImage;
				final Point origin = new Point (0, 0);
				final Canvas canvas = new Canvas (linkeSpalte, SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE | SWT.V_SCROLL);
				
				//Horizontal Scroll -> Canvas
				/*
				final ScrollBar CanvasScrollH = canvas.getHorizontalBar();
				CanvasScrollH.addListener
					(SWT.Selection, new Listener()
									{
										public void handleEvent (Event e)
										{
											int hSelection = CanvasScrollH.getSelection();
											int destX = -hSelection - origin.x;
											Rectangle rectangle = image.getBounds();
											canvas.scroll(destX, 0, 0, 0, rectangle.width, rectangle.height, false);
											origin.x = -hSelection;
										}
									}
					);
				*/
				//Vertical Scroll -> Canvas
				final ScrollBar CanvasScrollV = canvas.getVerticalBar();
				CanvasScrollV.addListener
					(SWT.Selection, new Listener()
									{
										public void handleEvent (Event e)
										{
											int vSelection = CanvasScrollV.getSelection();
											int destY = -vSelection - origin.y;
											Rectangle rectangle = image.getBounds();
											canvas.scroll(0, destY, 0, 0, rectangle.width, rectangle.height, false);
											origin.y = -vSelection;
										}
									}
					);
				
				canvas.addListener (SWT.Resize,  new Listener () {
					public void handleEvent (Event e) {
						Rectangle rect = image.getBounds ();
						Rectangle client = canvas.getClientArea ();
						//CanvasScrollH.setMaximum (rect.width);
						CanvasScrollV.setMaximum (rect.height);
						//CanvasScrollH.setThumb (Math.min (rect.width, client.width));
						CanvasScrollV.setThumb (Math.min (rect.height, client.height));
						int hPage = rect.width - client.width;
						int vPage = rect.height - client.height;
						//int hSelection = CanvasScrollH.getSelection ();
						int vSelection = CanvasScrollV.getSelection ();
						/*
						if (hSelection >= hPage) {
							if (hPage <= 0) hSelection = 0;
							origin.x = -hSelection;
						}
						*/
						if (vSelection >= vPage) {
							if (vPage <= 0) vSelection = 0;
							origin.y = -vSelection;
						}
						canvas.redraw ();
					}
				});
				
				canvas.addListener (SWT.Paint, new Listener () {
					public void handleEvent (Event e) {
						GC gc = e.gc;
						gc.drawImage (image, origin.x, origin.y);
						Rectangle rect = image.getBounds ();
						Rectangle client = canvas.getClientArea ();
						int marginWidth = client.width - rect.width;
						if (marginWidth > 0) {
							gc.fillRectangle (rect.width, 0, marginWidth, client.height);
						}
						int marginHeight = client.height - rect.height;
						if (marginHeight > 0) {
							gc.fillRectangle (0, rect.height, client.width, marginHeight);
						}
					}
				});
 
Hi.

Wenn Du ein Pic direkt auf ein Canvas malst, weiß das Canvas erstmal nicht, was du überhaupt da drauf gemalt hast. Du müsstest einen Resizelistener auf die rechte Spalte setzen und musst dann dein Bild selbst komplett neu auf das Canvas malen. Das wird sehr CPU lastig werden, da ein Resize Event viele Male pro Sekunde gefeuert wird.

Besser wäre es nach meiner Meinung, das Bild innerhalb eines LayoutManagers (z. B. GridLayout) als Widget hinzuzufügen, genauer gesagt als Label mit
Code:
label.setImage(Image img);
Dem LayoutManager sagst du dann
Code:
GridDataFactory.fillDefaults().grab(true, true).applyTo(label);

Was Dein Label über den gesamten Platz seines eigenen Containers streckt. Wenn Du das Label also in eine Composite packst, muss auch die Composite gestreckt werden.

Beachte aber, dass das Bild dann nur bis maximal zur Originalgröße gestreckt wird.

Das wäre auch schon fast die Antwort für beide Fragen.
Weitere Bilder fügst du ebenso als Label unten drunter ein. Das macht der LayoutManager dann ganz automatisch, wenn dein GridLayout das Attribut numColumns = 1 hat. Wenn 2, dann kommt das nächste Bild daneben und das dritte wieder unten drunter usw.
 
Zuletzt bearbeitet:

Zurück
Oben