# Mit Java Desktop abmessungen height/width abfragen



## HannesG (22. Jan 2008)

Mit welcher Klasse geht das?


----------



## The_S (22. Jan 2008)

Toolkit


----------



## HannesG (22. Jan 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Toolkit



danke dir, hat sich seit java 1.4 oder so etwas geändert ? siehe hier zur Erläuterung: http://www.java-forum.org/de/viewto...ys=0&postorder=asc&highlight=fenster+andocken

Kann man mit java 1.6_04 fenster andocken am desktop rand ? Eigentlich reicht mir doch die toolkit klasse, da ich ja nur die Größe des desktop abfrage dann -10 x pixel position des fensters und position des fensters ist schwupps gleich breite desktop - meinFensterbreite = x pos von meinFenster, sehe ich das richtig?


----------



## HannesG (22. Jan 2008)

ok hab da mal was probiert:

Das Fenster dockt wunderbar schön an nur:

1. Immer bündig rechts unten nicht links oben (das dürfte ich hinbekommen   :lol: )

2. Das Fenster wird IMMER rechts unten angedockt obwohl die if Bedingung gar nicht immer erfüllt sein sollte...???

Wenn ihr sonst noch Verbesserungsvorschläge habt wie ich den position code optimieren kann immer her damit! danke


```
class MyDockedWindow extends ComponentAdapter
   {
      public void componentMoved(ComponentEvent e)
      {         
         System.out.println("Höhe Desktop: " + dim.getHeight() + "Breite Desktop: " + dim.getWidth());
                 
         if(fenster.getLocation().x == (dim.getWidth() - 390) && fenster.getLocation().y == (dim.getHeight() - 530));
         {
        	 System.out.println("Angedockt!");
        	 fenster.setLocation((int)dim.getWidth()- 380,(int)dim.getHeight() - 520);
         }
         
      }      
}
```


Mein JFrame hat eine feste Breite von 380 pixel und eine feste Höhe von 520. Der warum ich weiter oben 390 und 530 angebe liegt daran, dass bei einem 10px abstand vom Desktop-Rand rechts/oben angedockt werden soll.

Doch irgendwie happerts an der Logik ^^


----------



## HannesG (22. Jan 2008)

so nochmals gefrimmelt:



```
fenster.setLocation((int)dim.getWidth()-380,(int)dim.getHeight()-(int)dim.getHeight());
```

dockt zwar rechts oben an doch eben IMMER von programmstart an ab, kann fenster wegziehn egal wohin das klebt immer am rechten rand?  :lol:


----------



## The_S (23. Jan 2008)

OK, und jetzt nochmal langsam zum Mitschreiben: Was geht jetzt genau nicht und wie soll es gehen?


----------



## HannesG (23. Jan 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> OK, und jetzt nochmal langsam zum Mitschreiben: Was geht jetzt genau nicht und wie soll es gehen?



Geht nicht: egal was in der if Bedingung steht es wird IMMER gedockt?
Soll gehen: sobald das fenster 10 pixel von rechts/oben sich befindet soll es andocken an die rechte obere ecke , noch besser wäre natürlich nur rechts andochen oder nur oben sprich wenn ich das fenster an den rechten Rand ziehe soll es nicht noch automatisch sich ganz oben andocken wobei das wäre erstmal ein guter Zusatz wichtig ist, dass es erstmal richtig andockt...



```
public class DockingWindow extends JFrame
{    
   static final long serialVersionUID = 1L;    
   static DockingWindow myWindow;   
   Toolkit tk = Toolkit.getDefaultToolkit();
   Dimension dim = tk.getScreenSize();   
   
   public DockingWindow() throws IOException
   {
	  super("Docking Window");	  
	  myWindow = this;	 
      addComponentListener(new MyDockedWindow());       
   }
   
   class MyDockedWindow extends ComponentAdapter
   {
      public void componentMoved(ComponentEvent e)
      {                
         //System.out.println("myWindow Position-x: " +myWindow.getLocation().x+"myWindow Position-y: " +myWindow.getLocation().y );             
         //if(myWindow.getLocation().x > (dim.getWidth() - 390) && myWindow.getLocation().y > (dim.getHeight() - 530));
         if(myWindow.getLocation().x > 1290);
         {
        	 System.out.println("Angedockt!");
        	 //myWindow.setLocation((int)dim.getWidth()- 380,(int)dim.getHeight() - 520);        	 
        	 myWindow.setLocation((int)dim.getWidth()-380,(int)dim.getHeight()-(int)dim.getHeight());        	 
         }      
          	 
      }      
   }  

   public static void main(String args[])throws Exception
   {   
	   
	      DockingWindow myWindow = new DockingWindow();
	      myWindow.setSize(380,520);
	      myWindow.setLocationRelativeTo(null);
	      myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	      myWindow.setResizable(false);
	      myWindow.setVisible(true);
   }
}
```


----------



## HannesG (24. Jan 2008)

bump ^^


----------



## *Hendrik (24. Jan 2008)

10 war etwas knapp, ich habe mal 25 als Abstand genommen.


```
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.IOException;
import javax.swing.JFrame;

public class DockingWindow extends JFrame {

    static final long serialVersionUID = 1L;
    static DockingWindow myWindow;
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension dim = tk.getScreenSize();

    public DockingWindow() throws IOException {
        super("Docking Window");
        myWindow = this;
        addComponentListener(new MyDockedWindow());
    }

    class MyDockedWindow extends ComponentAdapter {

        public void componentMoved(ComponentEvent e) { 

            //Fensterposition ermitteln   
            Point location = myWindow.getLocation();
            double location_X = location.getX();
            double location_Y = location.getY();

            //5 mögliche Andockbereiche
            //1. links
            //2. links oben
            //3. oben
            //4. rechts oben
            //5. rechts

            //links oben prüfen
            if (location_X <= 25 && location_Y <= 25) {

                myWindow.setLocation(0, 0);

            //links profen    
            } else if (location_X <= 25) {

                myWindow.setLocation(0, (int) location_Y);

            //oben rechts prüfen
            } else if (location_X >= dim.width - (25 + myWindow.getWidth()) && location_Y <= 25) {

                myWindow.setLocation(dim.width - myWindow.getWidth(), 0);

            //rechts prüfen
            } else if(location_X >= dim.width - (25 + myWindow.getWidth())){
                
                myWindow.setLocation(dim.width - myWindow.getWidth(), (int)location_Y);               
                
            //oben prüfen
            } else if (location_Y <= 25) {

                myWindow.setLocation((int) location_X, 0);

            }
        }
    }

    public static void main(String args[]) throws Exception {

        DockingWindow myWindow = new DockingWindow();
        myWindow.setSize(380, 520);
        myWindow.setLocationRelativeTo(null);
        myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myWindow.setResizable(false);
        myWindow.setVisible(true);
    }
}
```


----------



## *Hendrik (24. Jan 2008)

Und Dein Fenster dockt immer an, weil Du hinter Deiner if-Bedingung ein Semikolon hast.


```
if(myWindow.getLocation().x > 1290);
```


----------



## HannesG (24. Jan 2008)

*Hendrik hat gesagt.:
			
		

> ...weil Du hinter Deiner if-Bedingung ein Semikolon hast.
> 
> 
> ```
> ...



sigh!  :autsch:  komisch warum eclipse net gemeckert hat da?


----------



## HannesG (24. Jan 2008)

Das Fenster flackert unglaublich wenn ich es an die dock-zone bringe und dann auch noch damit herumfahre am Rand. Wie läßt sich das bessern? Bei winamp gibts sowas net, kann ja net nur daran liegen, dass es mit c gecodet ist...


----------



## HannesG (24. Jan 2008)

oder liegt das vllt. an meinem TFT ?


----------



## The_S (24. Jan 2008)

Flackert es, während du es "andocken" lässt? Und davor und danach nicht mehr? Oder wie ist das zu verstehen?


----------



## Atze (24. Jan 2008)

HannesG hat gesagt.:
			
		

> *Hendrik hat gesagt.:
> 
> 
> 
> ...



warum soll eclipse denn da meckern?

ist doch syntaktisch völlig korrekt:

wenn die bedingung zutrifft wird ";" ausgeführt

danach folg in den geschweiften klammern ein block-statement, das immer ausgeführt wird

hättest du ein else dahinter hätte eclipse das schon gemerkt


----------



## HannesG (24. Jan 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Flackert es, während du es "andocken" lässt? Und davor und danach nicht mehr? Oder wie ist das zu verstehen?



Es flackert wenns andockt und es flackert stark(sieht aus als springt das fenster hin/her), wenn ich das fenster in den andockbereich bringe und die Maustaste nicht loslasse danach. Sieht übelst aus.


----------



## HannesG (24. Jan 2008)

ok es flackert nur wenn ich Substance theme benutze nicht bei Swing... ich denke mal da kann ich jetzt nichts ändern, oder wie seht ihr das außer substance weglassen ist aber keine lösung, da swing häßlich wie d´nacht ist.


----------



## The_S (24. Jan 2008)

dann verwende doch Looks von JGoodies. Ist auch schön anzusehen.


----------



## HannesG (24. Jan 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> dann verwende doch Looks von JGoodies. Ist auch schön anzusehen.



JGoodies gibts da dieses flacker problem nicht? Weil du nicht sagtest :"teste doch Looks von JGoodies" sondern "verwende doch Looks..." von daher gehe ich aus du weißt mehr...


----------



## The_S (24. Jan 2008)

ne, ich weiß net mehr  . Aber JGoodies hat auch sehr schöne LaFs und ein versuch is es doch allemal wert


----------



## HannesG (24. Jan 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> ne, ich weiß net mehr  . Aber JGoodies hat auch sehr schöne LaFs und ein versuch is es doch allemal wert



ok benutzt und die Jcomboboxen sehen übelst aus weil... da ist nur ein schwarzer pfeil nach unten der von in die rechte ecke gedrängt ist. wäre da noch eine vertikale linie zur trennung der eingabe aber so siehts aus wie ein jbutton mit icon völlig lächerlich weil... ich gerade erst vorhin ne pdf von dem Karsten coder las dass sie wert auf durchgängigen style legen etc eindeutig sein soll usw. und genau das ist jgoodies nicht.

doch der Hauptunerschied ist mit jgoodies ruckelt es nicht mehr ich denke ich weiß warum.

Der Unterschied zwischen swing,jgoodies UND substance liegt darin, dass beim bewegen des Fenster nur bei substance der fensterinhalt mitgezeichnet wird. Mit swing/jgoodies wird lediglich ein leer transparenter rahmen gezogen der das Fenster darstellen soll. Schade ic liebe substance... naja vllt. lass ich das docking dingens dann weg ^^


----------

