Resizing Probleme bei JInternalFrames

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
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:

Code:
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:

Code:
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
 
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:

Code:
// 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
 
Hallo!

Hab das Problem gerade selbst gelöst.

Wenn ich die Child Windows anstatt mit
Code:
child.setMaximum(true);
mit
Code:
desktop.getDesktopManager().maximizeFrame(child);
vergrössere, dann funktioniert alles wunderbar.

Grüsse,
Alex

P.S. Danke für die Mühe Sunny!
 
nutze nicht
Code:
.dispose()
sondern
Code:
.doDefaultCloseAction()

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

Ebenius
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben