# Resizing Probleme bei JInternalFrames



## Gast (21. Nov 2003)

Hallo Leute,

ich entwickle eine MDI Anwedung mittels JDesktopPane und JInternalFrame. Immer wenn ich das WindowsLookAndFeel verwende habe ich folgende Probleme:

(1) Ich öffne 2 Fenster A und B, die sofort maximiert werden. Schliesse ich nun z.b. Fenster B mit einem selbst definierten Button, verliert Fenster A den Focus und ändert seine Grösse (perferredSize). Klicke ich nun auf Fenster A erhält es den Focus und maximiert sich automatisch wieder.

(2) Ich öffne 2 Fenster A und B, die sofort maximiert werden. Verkeinere ich nun z.B. Fenster B (auf Icongrösse), hat das wieder eine Grössenänderung von Fenster A zur Folge.

Bei Verwendung von MetalLookAndFeel oder MotifLookAndFeel gibt es keine Probleme.

Das folgende Programm demonstriert dieses Verhalten:

*MainWindow - Klasse:*


```
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.beans.PropertyVetoException;

public class MainWindow extends JFrame
{
    private JDesktopPane desktop;

    public MainWindow()
    {
        // Set the look and feel
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex)
        {
            ex.printStackTrace();
        }

        // Create and add JDesktopPane
        desktop = new JDesktopPane();
        getContentPane().add(desktop);

        // Create and add main menu
        JMenuBar  menubar = new JMenuBar();
        JMenu menu = new JMenu("Child Window");
        JMenuItem menuItem = new JMenuItem("New");
        menuItem.addActionListener(new MenuItemListener());
        menu.add(menuItem);
        menubar.add(menu);
        setJMenuBar(menubar);

        // Set some window parameters
        setTitle("Main Window");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setExtendedState(MAXIMIZED_BOTH);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        MainWindow app = new MainWindow();
    }

    private class MenuItemListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            ChildWindow child = new ChildWindow();
             desktop.add(child);
            try
            {
                child.setMaximum(true);
            } catch(PropertyVetoException ex)
            {
                ex.printStackTrace();
            }
            child.moveToFront();
        }
    }
}
```
*ChildWindow - Klasse:*


```
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.*;

public class ChildWindow extends JInternalFrame
{
    public ChildWindow()
    {
        super("Child Window", true, true, true, true);
        JButton button = new JButton("Close");
        button.addActionListener(new ButtonListener());
        getContentPane().add(button, BorderLayout.SOUTH);
        pack();
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setVisible(true);
    }

    private JInternalFrame getChildReference()
    {
        return this;
    }

    private class ButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            getChildReference().dispose();
        }
    }
}
```

Welche Möglichkeiten gibt es, diese Probleme zu lösen?

Grüsse,
Alex


----------



## Guest (21. Nov 2003)

hallo Alex,

hab dein programm mit jbuilder9 ausprobiert.
hatte zuerst das problem, dass die fenster nicht
maximiert wurden. verschob die zeile extendedstate
hinter die zeile visible. die fenster wurden 
vergrößert:


```
// Set some window parameters
setTitle("Main Window");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setExtendedState(MAXIMIZED_BOTH);  // muß nach setVisible stehen
```

dein problem mit focus und größe verändern trat bei mir
nicht auf. es funktionierte alles besstens.

vielleicht hilft das zeilenvertauschen.

gruß Sunny


----------



## Guest (21. Nov 2003)

muß natürlich bestens heißen (tippfehler)

Sunny


----------



## Gast (21. Nov 2003)

Hallo!

Hab das Problem gerade selbst gelöst.

Wenn ich die Child Windows anstatt mit 
	
	
	
	





```
child.setMaximum(true);
```
 mit 
	
	
	
	





```
desktop.getDesktopManager().maximizeFrame(child);
```
vergrössere, dann funktioniert alles wunderbar.

Grüsse,
Alex

P.S. Danke für die Mühe Sunny!


----------



## Ebenius (21. Nov 2003)

nutze nicht

```
.dispose()
```
sondern

```
.doDefaultCloseAction()
```

Löst das Problem auch. Mit beiden in Kombination solltest Du auf dem richtigen Weg sein!

Ebenius


----------

