# JFrame verkleinern



## Developer_X (3. Mrz 2009)

Hi, ich habe mein eigenes JFrame geschrieben, also undecorated, und das X und die die Vergrößerungs Taste durch Buttons, am rechten rand oben,  ersetzt,
es gibt da diesen strich´, der das frame verkleinert, wie kann man diese aktion machen, damit das frame verkleinert wird?

```
JFrame f = new JFrame();
```
Also wie kann ich die selbe aktion erfüllen, mit java, wie der strich, neben dem "X" und dem "Vergrößerungs" Feld, bei normalen Frames?


----------



## SlaterB (3. Mrz 2009)

frame.setExtendedState(JFrame.ICONIFIED);


----------



## Developer_X (3. Mrz 2009)

jo danke
!


----------



## Developer_X (3. Mrz 2009)

SlaterB der BUtton erscheint nicht, wenn ich deinen Code ein füge, in seinen Action Listener

```
JFrame f = new JFrame();
f.setLayout(null);
	 JButton b = new JButton("X"); b.setForeground(Color.red);b.setBackground(Color.black);
  	 b.setBounds(d.width-50,0,50,50); 
  	 b.addActionListener( new ActionListener() {public void actionPerformed(ActionEvent evt) {b1ActionPerformed(evt);}private void b1ActionPerformed(ActionEvent evt) {setExtendedState(JFrame.ICONIFIED); }});
  	f.add(b);
```


----------



## thE_29 (3. Mrz 2009)

Hier kann man sich auch viel vom Source abgucken!
Go state-of-the-art with IFrame


----------



## Developer_X (3. Mrz 2009)

ich kann daraus nicht viel entziffern, ich will so was gar nicht, ich hab fullscreen, und will einen Button dahin machen, wenn ich auf ihn klicke, dann soll das fenster verkleinert werden, wenn ich das einfüge wird der button nicht angezeigt, kannst du mir dazu vielleicht was sagen
bitte==


----------



## SlaterB (3. Mrz 2009)

wenn du den ActionListener entfernst, wird der Button dann angezeigt?
nein? -> hat gar nix mit der ActionListener-Aktion zu tun

> b.setBounds(d.width-50,0,50,50); 
kann alles mögliche bedeuten, wenn man d nicht kennt,
ohne setSize()-Aufruf ist bei mit das JFrame eh komplett leer usw,

vollständige Programme posten, dazu gehört auch eine Klasse, eine main-Methode usw.!

falls der ActionListener bei dir kompiliert, läßt das vermuten, dass du dich in einer Klasse befindest, die von Frame/ JFrame erbt,
wenn du aber ein separates JFrame-Objekt f hast und anzeigst, dann wird dir der Aufruf beim this-Objekt der eigenen Klasse wenig helfen


setExtendedState() muss natürlich an f aufgerufen werden

oder der Button in das this-Objekt eingefügt werden


----------



## Developer_X (3. Mrz 2009)

der button funktioniert, ohne die actionlistener methode, man sieht ihn
ich weiß wo sich d befindet, ok?
das liegt an diesem 

```
setExtendedState(JFrame.ICONIFIED
```


----------



## SlaterB (3. Mrz 2009)

wie du meinst,
dass ein ActionListener das Layout ändert, ist mir bisher aber noch nicht vorgekommen,

vielleicht gibts eine Fehlermeldung wegen des von mir schon halb erwähnten seltsamen Aufruf, die du nicht siehst oder nicht ausgibst,
teste mal System.out.println("Meldung"); nach der Deklaration des ActionListeners,
wenn nicht zu sehen, aber ohne ActionListener schon, dann deutet das auf Abbruch durch Exception hin


ein vollständiges Programm ist es immer noch nicht


----------



## Developer_X (3. Mrz 2009)

so ich habs getestet, ohne deinen code, aber mit systemout das funzt


----------



## Developer_X (3. Mrz 2009)

so viel kann ich sagen


```
public Main_1() 
  {
	  
	  
      super("Test"); 
      
      Toolkit tk = Toolkit.getDefaultToolkit();
      final Dimension d = tk.getScreenSize();
		 
      setUndecorated(true); 
      setSize(900,900); 
      setVisible(true); 
      
      Cursor cur = getToolkit().createCustomCursor(
			  new ImageIcon( "F:/Cursor.gif" ).getImage(),
			  new Point(0,5), "Cursor" );

	setCursor( cur );			

      
    String fnm =  "F:/Rayman/Level_1/World.txt";        
   
    MazeManager mm = new MazeManager(fnm);
    BirdsEye be = new BirdsEye(mm);      										

    WrapMaze3D w3d = new WrapMaze3D(mm, be );

    Container c = getContentPane();
    c.setLayout( new BoxLayout(c, BoxLayout.X_AXIS) );
    c.add(w3d);  
    c.add( Box.createRigidArea( new Dimension(d.width,d.height)) ); 
    
    Box vertBox = Box.createVerticalBox();
    
    vertBox.add( Box.createRigidArea( new Dimension(d.width-100,d.height)) );
    c.add(vertBox);

    pack();    
    URL url = null;
  	try {
  		url = new URL("file:///F:/Rayman/Level_1/S.Loodp.1.wav");
  	} catch (MalformedURLException e) {
  		// TODO Auto-generated catch block
  		e.printStackTrace();
  	} 
  	AudioClip clip = Applet.newAudioClip(url); 
  	 clip.loop(); 
  	 warte(10);
  	 
  	 JButton b = new JButton("X"); b.setForeground(Color.red);b.setBackground(Color.black);
  	 b.setBounds(d.width-50,0,50,50); 
  	 b.addActionListener( new ActionListener() {public void actionPerformed(ActionEvent evt) {b1ActionPerformed(evt);}private void b1ActionPerformed(ActionEvent evt) {setExtendedState(JFrame.ICONIFIED); }});
  	 add(b);
  	 

  	 
    
  }
```


----------



## Developer_X (3. Mrz 2009)

nein warte, jetzt ist es da, wenn ich aber draufklicke, dass fenster sich verkleinert, und ich es dann wieder vergrößere ist der button weg, was kann ich dagegen tun


----------



## Ebenius (3. Mrz 2009)

Hier nochmal formatierter Quelltext: [HIGHLIGHT="Java"]public Main_1() {
  super("Test");

  Toolkit tk = Toolkit.getDefaultToolkit();
  final Dimension d = tk.getScreenSize();

  setUndecorated(true);
  setSize(900, 900);
  setVisible(true);

  Cursor cur =
        getToolkit().createCustomCursor(
              new ImageIcon("F:/Cursor.gif").getImage(), new Point(0, 5),
              "Cursor");

  setCursor(cur);

  String fnm = "F:/Rayman/Level_1/World.txt";

  MazeManager mm = new MazeManager(fnm);
  BirdsEye be = new BirdsEye(mm);

  WrapMaze3D w3d = new WrapMaze3D(mm, be);

  Container c = getContentPane();
  c.setLayout(new BoxLayout(c, BoxLayout.X_AXIS));
  c.add(w3d);
  c.add(Box.createRigidArea(new Dimension(d.width, d.height)));

  Box vertBox = Box.createVerticalBox();

  vertBox.add(Box.createRigidArea(new Dimension(d.width - 100, d.height)));
  c.add(vertBox);

  pack();
  URL url = null;
  try {
    url = new URL("file:///F:/Rayman/Level_1/S.Loodp.1.wav");
  } catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  AudioClip clip = Applet.newAudioClip(url);
  clip.loop();
  warte(10);

  JButton b = new JButton("X");
  b.setForeground(Color.red);
  b.setBackground(Color.black);
  b.setBounds(d.width - 50, 0, 50, 50);
  b.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent evt) {
      b1ActionPerformed(evt);
    }

    private void b1ActionPerformed(ActionEvent evt) {
      setExtendedState(JFrame.ICONIFIED);
    }
  });
  add(b);
}[/HIGHLIGHT]

Ebenius


----------



## SlaterB (3. Mrz 2009)

> was kann ich dagegen tun 

ordentliches Layout, 
Box kenne ich nicht, aber dass deren Größe die ganze Screensize einnimmt, läßt wenig Platz für anderes..

wozu b.setBounds(d.width - 50, 0, 50, 50);
wenn du inzwischen doch BoxLayout verwendest?

bitte erst ein klares Konzept, dann anfangen zu programmieren,
einen wav-Sound musst du nicht zwischendurch auch noch starten, während du gerade am Layout feilst

pack(); wahrscheinlich erst ganz am Ende aufrufen

@Ebenius:
überall Code doppelt posten ist auch nicht gerade übersichtlich..
(von bunten Text in meinem Posting ganz abgesehen)


----------



## Ebenius (3. Mrz 2009)

SlaterB hat gesagt.:


> @Ebenius:
> überall Code doppelt posten ist auch nicht gerade übersichtlich..
> (von bunten Text in meinem Posting ganz abgesehen)


Doppelpost sehe ich ein, aber der Code oben war wirklich nicht so recht lesbar und komplett umformatieren wollte ich ihn nicht im Originalbeitrag. Bunt bekommst Du weg, wenn Du nicht den WYSIWYG-Editor, sondern den Standard-Editor nimmst. Und die fehlenden Zeilennummern beim normalen CODE-Tag stören gewaltig. Soviel zu meiner Motivation.

Ebenius


----------



## Ebenius (3. Mrz 2009)

Developer_X, normaler Weise baut man eine GUI doch ein bisschen anders auf. Ein Standard-Beispiel findest Du im Sun Java Tutorial » Lesson: Performing Custom Painting. Arbeite Dich da mal durch und beachte folgende Aufteilung: Eine Start-Klasse die *nicht* von einer GUI-Komponente erbt, mit einer main-Methode, die über den Event Dispatch Thread die GUI aufbaut. JFrame vererbt man in der Regel nicht, sondern fügt lieber ein Panel zu einem normalen Frame. setVisible() macht man möglichst nicht über den Konstruktor sondern von außerhalb, weil man ansonsten das Frame nirgends wiederverwenden kann, usw. Geh einfach mal die einzelnen Schritte des Dokuments durch.

Ebenius


----------



## Developer_X (3. Mrz 2009)

so das ist das konzept, prinzipiell, und wenn ich auf den button drücke verschwindet er, wieso?

```
public Main_1() 
  {	  	  
      super("Test"); 
      
      Toolkit tk = Toolkit.getDefaultToolkit();
      final Dimension d = tk.getScreenSize();
		 
      setUndecorated(true); 
      setSize(900,900); 
      setVisible(true); 
      
  	 JButton b = new JButton("X"); b.setForeground(Color.red);b.setBackground(Color.black);
  	 b.setBounds(d.width-50,0,50,50); 
  	 b.addActionListener( new ActionListener() {public void actionPerformed(ActionEvent evt) {b1ActionPerformed(evt);}private void b1ActionPerformed(ActionEvent evt) {setExtendedState(JFrame.ICONIFIED); }});
  	 add(b);
  	 

  	 
    
  }
```
WOzu ich den platzt lasse müsst ihr nciht wissen, ich machs einfach ok ? 
Also der Button ist verschwunden, nachdem man einmal den BUtton angeklickt hat, das Fenster verkleinert wird, und man dann das Fenster wieder vergrößert. Wieso, was mache ich falsch?


----------



## SlaterB (3. Mrz 2009)

Ebenius hat gesagt.:


> JFrame vererbt man in der Regel nicht, sondern fügt lieber ein Panel zu einem normalen Frame.


ui, eine kühne Vorstellung, das wird schwer durchzusetzen,
google-Ergebnisse zu 'extends JFrame':  *185.000 
(hmm, wenn ich von google kopiere wirds auch fettgeschrieben,
na soll das Forum von mir aus leiden, wenn es es so haben will..)

über Sinn und Zweck will ich dabei gar nicht diskutieren, unter den ersten Links ist auch schon was dazu:
MyGUI extends JFrame - good or bad? (OO, Patterns, UML and Refactoring forum at JavaRanch)
*


----------



## SlaterB (3. Mrz 2009)

@Developer_X

bei mir ist der Button gar nicht zu sehen,
setVisible(true) erst am Ende ausführen, dann wird das Layout durchgerechnet


----------



## Developer_X (3. Mrz 2009)

ok
danke!!


----------



## Ebenius (4. Mrz 2009)

SlaterB hat gesagt.:


> ui, eine kühne Vorstellung, das wird schwer durchzusetzen,
> google-Ergebnisse zu 'extends JFrame'


Dann ändere ich meine Aussage zu: Man ist besser beraten, in diesem Fall nicht von JFrame zu erben. Wenn man später den selben Inhalt woanders braucht, ist ein JComponent-Derivat die Eindeutig bessere Wahl. Auch von der Wortbedeutung: Es ergibt mehr Sinn, eine Komponente zu erweitern ("extends") als ein Fenster, wenn es darum geht, den Inhalt des Fensters anzupassen und nicht die Funktionalität eines Fensters.

Aber auch das ist meine Meinung und keine allgemeingültige Weisheit. 

Ebenius


----------

