Un JFrame supplémentaire réduisant au minimum lorsque l'application principale JFrame se réduit au minimum

StackOverflow https://stackoverflow.com/questions/3449948

Question

L'application je travaille contient un JFrame principal, à partir de laquelle les utilisateurs pourraient éventuellement ouvrir un autre cadre supplémentaire. Je suis en train de mettre en œuvre un tel comportement de l'application où le cadre supplémentaire est réduite au minimum (iconifiée) dès que le cadre principal se réduit au minimum.

Je pensais redéfinissant la méthode setExtendedState du châssis principal pour capturer le moment où il se réduit au minimum, et événement de changement de propriété du feu à partir de là pour que le cadre supplémentaire peut agir sur lui.

Je découvre cependant que se malheureusement la setExtendedState surchargée n'a jamais appelé.

J'apprécierais beaucoup des idées de réaliser le comportement souhaité. Ci-dessous le I code utilisé pour tester ...

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;


public class IconifySupplementaryFrameTest {

    public static void main(String[] args) {
        (new MainFrame()).setVisible(true);
    }

}

class MainFrame extends JFrame {
    public static final String EXTENDED_STATE_KEY = "extendedState";

    MainFrame() {
        super("Iconify test - main window");

        setLayout(new FlowLayout(FlowLayout.LEADING));

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 400);
        setLocationByPlatform(true);

        add(new JButton(new AbstractAction("Show supplementary frame") {
            @Override
            public void actionPerformed(ActionEvent e) {
                SupplementaryFrame.doShow(MainFrame.this);
            }
        }));
    }

    @Override
    public synchronized void setExtendedState(int state) {
// This overridden method is never called ???       
        int oldState = getExtendedState();
        super.setExtendedState(state);
        firePropertyChange(EXTENDED_STATE_KEY, oldState, state);
    }
}


class SupplementaryFrame extends JFrame implements PropertyChangeListener {
    private static SupplementaryFrame instance;

    private SupplementaryFrame(final JFrame parentFrame) {
        super("Iconify test - supplementary window");

        setSize(300, 300);
        setLocationRelativeTo(parentFrame);

        parentFrame.addPropertyChangeListener(
                MainFrame.EXTENDED_STATE_KEY, this);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                instance = null;
                parentFrame.removePropertyChangeListener(
                        MainFrame.EXTENDED_STATE_KEY,
                        SupplementaryFrame.this);
                SupplementaryFrame.this.dispose();
            }
        });
    }


    static void doShow(JFrame parentFrame) {
        if(instance == null) {
            instance = new SupplementaryFrame(parentFrame);
            instance.setVisible(true);
        }
        else {
            // omitted _ugly_ code to bring this window (instance) to front 
        }

    }


    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        int state = this.getExtendedState();
        int parentState = ((Integer)evt.getNewValue()).intValue();

        if((parentState & ICONIFIED) == ICONIFIED) 
            this.setExtendedState(state | ICONIFIED);
    }
}
Était-ce utile?

La solution

Il suffit d'ajouter WindowStateListener à MainFrame pour faire votre travail de code avec changement de propriété auditeur:

addWindowStateListener(new WindowStateListener() {

        @Override
        public void windowStateChanged(WindowEvent e) {
                firePropertyChange(EXTENDED_STATE_KEY, e.getOldState(), e.getNewState());
        }
    });

Autres conseils

  

L'application Je travaille sur   contient un JFrame principal, à partir duquel   les utilisateurs peuvent éventuellement ouvrir une autre   cadre supplémentaire

Les applications sont généralement conçus pour utiliser un seul JFrame. fenêtres supplémentaires sont créées à l'aide d'un JDialog. Lorsque vous créez la marque de dialogue que vous spécifiez le cadre en tant que propriétaire de la boîte de dialogue. Maintenant, quand vous iconify / deiconify le cadre, la boîte de dialogue est iconifiée synchronisera automatiquement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top