JInternFrame über Desktopgrenzen resizen können

F

frohesFest

Die Default-Einstellungen für ein JDesktopPane sind, dass ich ein JInternFrame im Desktop nicht über die Grenzen hinaus resizen kann. Die Maus dragged weiter, die Frameborder des JInternalFrame verharrt an der Desktopgrenze.

Wie muss ich vorgehen, um das resizen des JInternalFrame über die Desktopgrenze hinaus zu ermöglichen. Ich habe da was zum Desktopmanager gefunden, habe aber keinen Plan. Vielleicht kann jemand helfen. Frohes Fest.

Code:
                JDesktopPane desktop=new JDesktopPane();
                desktop.setDesktopManager(new DefaultDesktopManager(){
                        @Override
                        public void activateFrame(JInternalFrame arg0) {
                        }
                        @Override
                        public void beginDraggingFrame(JComponent arg0) {
                        }
                        @Override
                        public void beginResizingFrame(JComponent arg0, int arg1) {
                        }
                        @Override
                        public void closeFrame(JInternalFrame arg0) {
                        }
                        @Override
                        public void deactivateFrame(JInternalFrame arg0) {
                        }
                        @Override
                        public void deiconifyFrame(JInternalFrame arg0) {
                        }
                        @Override
                        public void dragFrame(JComponent arg0, int arg1, int arg2) {
                        }
                        @Override
                        public void endDraggingFrame(JComponent arg0) {
                        }
                        @Override
                        public void endResizingFrame(JComponent arg0) {
                        }
                        @Override
                        public void iconifyFrame(JInternalFrame arg0) {
                        }
                        @Override
                        public void maximizeFrame(JInternalFrame arg0) {
                        }
                        @Override
                        public void minimizeFrame(JInternalFrame arg0) {
                        }
                        @Override
                        public void openFrame(JInternalFrame arg0) {
                        }
                        @Override
                        public void resizeFrame(JComponent arg0, int arg1, int arg2,
                                        int arg3, int arg4) {
                        }
                        @Override
                        public void setBoundsForFrame(JComponent arg0, int arg1, int arg2,
                                        int arg3, int arg4) {
                        }

                });
                setContentPane(desktop);
 
Zeige mal, was ich vor habe. Ich will ein JInternalFrame in einem JDialog unterbringen. Durch das draggen des Titlepane von dem JIntenalFrame wird auch die setLocation des JDialog geändert. Wenn ich die Größe des JInternalFrame verändere, wird auch das setSize des JDialog geändert.

Das Problem ist, wenn ich versuche, das JInternalFrame zu vergrößern. Hier wird das JInternalFrame durch eine Funktion des JDesktopPane daran gehindert, sich weiter auszudehnen, da es sich ja schon an der Grenze zum JDialog befindet. IMHO liegt das an den Einstellungen und Properties des DesktopManager. Ich weiß aber nicht wie oder wo ich da eingreifen kann.


Code:
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
 
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JDialog;
import javax.swing.JInternalFrame;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import javax.swing.plaf.basic.BasicInternalFrameUI;
 
@SuppressWarnings("serial")
public class InternFrameExtern extends JDialog{
	JDesktopPane sDesktopPane;
	private JInternalFrame jInternalFrame;
	private JComponent northPane;
	private int pressedX=0;
	private int pressedY=0;
	public InternFrameExtern(String title){
 
		setUndecorated(true);
		
		sDesktopPane=new JDesktopPane();
 
		setContentPane(sDesktopPane);
		jInternalFrame=new JInternalFrame("Test",true,true);
		jInternalFrame.setSize(new Dimension(300,170));
		jInternalFrame.addInternalFrameListener(new InternalFrameAdapter(){
	        public void internalFrameClosing (InternalFrameEvent e){}
	        public void internalFrameOpened(final InternalFrameEvent e){}
	        public void internalFrameClosed(final InternalFrameEvent e){
	        	InternFrameExtern.this.setVisible(false);
	        	InternFrameExtern.this.dispose();
	        }
	        public void internalFrameIconified(final InternalFrameEvent e){}
	        public void internalFrameDeiconified(final InternalFrameEvent e){}
	        public void internalFrameActivated(final InternalFrameEvent e){}
            public void internalFrameDeactivated(final InternalFrameEvent e){}
	    });
		
		northPane=((BasicInternalFrameUI)jInternalFrame.getUI()).getNorthPane();
		northPane.addMouseListener(new MouseListener(){
			public void mouseClicked(MouseEvent e){}
			public void mouseEntered(MouseEvent e){}
			public void mouseExited(MouseEvent e){}
			public void mousePressed(MouseEvent e) {
				pressedX=e.getX();
				pressedY=e.getY();
			}
			public void mouseReleased(MouseEvent e){}
		});
		northPane.addMouseMotionListener(new MouseMotionListener(){
			public void mouseDragged(MouseEvent e){
				int draggedObjX=InternFrameExtern.this.getLocation().x+e.getX()-pressedX;
				int draggedObjY=InternFrameExtern.this.getLocation().y+e.getY()-pressedY;
				InternFrameExtern.this.setLocation(draggedObjX,draggedObjY);
				InternFrameExtern.this.getjInternalFrame().setLocation(0,0);
			}
			public void mouseMoved(MouseEvent e){}
			
		});
		
		sDesktopPane.add(jInternalFrame);
		jInternalFrame.setVisible(true);
		
		jInternalFrame.addComponentListener(new ComponentAdapter(){
			public void componentResized(ComponentEvent e){
				InternFrameExtern.this.setSize(jInternalFrame.getSize().width,jInternalFrame.getSize().height);
			}
		});
 
		setSize(jInternalFrame.getSize());
		setLocation(new Point(50,50));
	}
	public JComponent getNorthPane(){
		return northPane;
	}
	public JInternalFrame getjInternalFrame(){
		return jInternalFrame;
	}
 
	public static void main(String[] args){
		InternFrameExtern td=new InternFrameExtern("Desktop");
		td.setVisible(true);
	}
}
 
Zurück