Swing Location und Height/Width nicht kompatibel?

Spitfire777

Bekanntes Mitglied
hi,

hab hier ne methode geschrieben, die ein frame an ein anderes "andocken" lässt.

Java:
    public void dockToFrame(AbstractFrame frame, int position) {

        switch (position) {
            case 1:
                int availableSpace = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() - getSize().getWidth() - frame.getSize().getWidth());

                if (availableSpace > 0) {
                    setLocation((int) availableSpace, (int) frame.getLocation().getY());
                }

                break;

        }
    }

Jetzt ists aber so, dass zwar das Frame andockt, jedoch sehr ungenau. Ich könnte jetzt anfangen, Pixel zu addieren/subtrahieren, aber das wäre keine saubere Lösung.
 
Ups, ich hab da einen alten Code kopiert.

Unten ist der richtige.
Mit ungenau meine ich, dass sie sich etwas überlappen (Windows), unter Ubuntu guck ich nacher mal, sollte aber aber auch dasselbe Problem sein.

Java:
public abstract class AbstractFrame extends JFrame {
    public static final int LEFT = 1;
    public static final int RIGHT = 2;
    public static final int BOTTOM = 3;
    public static final int TOP = 4;

    public void centerFrame() {
        int screensizeX = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        int screensizeY = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        int windowsizeX = (int) getSize().getWidth();
        int windowsizeY = (int) getSize().getHeight();

        setLocation((screensizeX - windowsizeX) / 2, (screensizeY - windowsizeY) / 2);
    }

    public void posRightTop() {
        int screensizeX = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        int screensizeY = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
        int windowsizeX = (int) getSize().getWidth();
        int windowsizeY = (int) getSize().getHeight();

        setLocation(screensizeX - windowsizeX - 5, 5);
    }

    public void posLeftTop() {
        setLocation(0, 0);
    }

    public void dockToFrame(AbstractFrame frame, int position) {

        switch (position) {
            case 1:
                int availableSpace = (int) (frame.getLocation().getX() - getSize().getWidth());

                if (availableSpace > 0) {
                    setLocation((int) availableSpace, (int) frame.getLocation().getY());
                }

                break;

        }
    }
}

Dann am besten zwei einfache Frameklassen nehmen und von AbstractFrame ableiten.

Java:
public class Main {
public static void main(String[] args) {
FrameXY frame1 = new FrameXY();
FrameXY frame2 = new FrameXY();
frame1.setVisible(true);
frame2.setVisible(true);

// frame1 an frame2 andocken
frame1.dockToFrame(frame2, AbstractFrame.LEFT);
} 
}
 
Hmm..

dann liegts an Windows >(

berlappene6e1.png


Ich könnte ja sicherlich jetzt das Betriebssystem auslesen und im Falle von Windows Pixel addieren bzw. subtrahieren. Aber gibts da nicht was eleganteres?
 
Was 'n Zufall, an der Methode hab ich grad gebastelt. Ich kopier sie mal ganz faul, wobei CURRENTDIALOG das anzudockende und MAINFRAME das (Überraschung) "Hafenfenster" ist. Die if-Abfrage prüft zusätzlich, ob das Fenster minimiert ist.

Java:
public void focusCurrentDialog(){
	if(CURRENTDIALOG.getState()==JFrame.ICONIFIED) CURRENTDIALOG.setState(JFrame.NORMAL);
	Point pos = MAINFRAME.getLocationOnScreen();
	CURRENTDIALOG.setLocation(pos.x+MAINFRAME.getWidth(),pos.y);
	CURRENTDIALOG.requestFocus();
}
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben