JDesktoppane

dadom110

Erfahrenes Mitglied
Guten Tag zusammen,

folgendes Problem: Ich habe ein JDesktopPane, auf dem ich mehrerere InternalFrames liegen habe. Das Problem ist, das die internen Fenster nicht problemlos dargestellt werden. Wenn die Fenster nicht maximiert sind, hat er ein Problem mit mehreren Fenster, da er sobald mehrere Fenster auf dem DesktopPane liegen, minimiert er alle Fenster, beim Versuch diese größer zu ziehen, schiebt er sie wieder in die Mitte und verkleinert es wieder. Er scheint Probleme damit zu haben die Fenster übereinander dar zu stellen, weil er sich die Fenster immer wieder minimiert und in der mitte nebeneinander positioniert...

Jemand eine Idee?

Grüße
Dom
 
Anderes kleines Problem:

Wie verhindere ich das ich innerhalb des DesktopPanes die einzelenen InternalFrames ausserhalb des Sichtbaren bereiches ziehen kann? (das InternalFrame soll immer komplett dargestellt werden)

Grüße
Dom
 
Hallo Dom,

also es gibt keine Methode oder UIDefault von JInternalFrame und JDesktopPane, welches deinen Wunsch nachkäme. Allerdings könnte es du auf Unkonventionellerweise die InternalFrames dazu zwingen nicht den Sichtbaren Bereich zu verlassen.

Das ist hier ein erster Ansatz. Wenn du diesen Weg weiter gehen möchtest, müsstest du weitere Cases bzw. Fälle abfangen. Bspw. was soll passieren wenn das JFrame bzw. das JDesktopPane verkleinert wird und das JInternalFrame nicht mehr vollständig darauf passt.

Java:
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;

public class JInternalFrameDemo extends JFrame {

	private JDesktopPane desktop = new JDesktopPane();

	private JSuperInternalFrame iFrame1 = new JSuperInternalFrame("Titel",
			true, true, true, true);

	private JSuperInternalFrame iFrame2 = new JSuperInternalFrame("Titel",
			true, true, true, true);

	public JInternalFrameDemo() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);
		this.setSize(700, 500);

		iFrame1.setSize(400, 300);
		iFrame1.setLocation(100, 80);
		iFrame1.setVisible(true);

		iFrame2.setSize(200, 200);
		iFrame2.setLocation(200, 10);
		iFrame2.setVisible(true);

		desktop.add(iFrame1);
		desktop.add(iFrame2);

		this.add(desktop);
		this.setVisible(true);
	}

	public static void main(String[] args) {
		new JInternalFrameDemo();
	}

	class JSuperInternalFrame extends JInternalFrame implements
			ComponentListener {
		private Point loc = new Point();

		private Dimension size = new Dimension();

		private Dimension sizeDesk = new Dimension();

		public JSuperInternalFrame(String string, boolean b, boolean c,
				boolean d, boolean e) {
			super(string, b, c, d, e);
			this.addComponentListener(this);
		}

		public void componentResized(ComponentEvent e) {
		}

		public void componentMoved(ComponentEvent e) {
			loc = this.getLocation();
			size = this.getSize();
			if (this.getDesktopPane() != null)
				sizeDesk = this.getDesktopPane().getSize();
			if (loc.x < 0)
				loc.x = 0;
			if (sizeDesk.width > 0 && loc.x + size.width > sizeDesk.width)
				loc.x = sizeDesk.width - size.width;
			if (sizeDesk.height > 0 && loc.y + size.height > sizeDesk.height)
				loc.y = sizeDesk.height - size.height;
			if (loc.y < 0)
				loc.y = 0;
			this.setLocation(loc);
		}

		public void componentShown(ComponentEvent e) {
		}

		public void componentHidden(ComponentEvent e) {
		}
	}
}


Vg Erdal
 
Zurück