【问题标题】:Minimizing a supplementary JFrame when main application JFrame gets minimized当主应用程序 JFrame 最小化时最小化补充 JFrame
【发布时间】:2010-08-10 14:20:22
【问题描述】:

我正在处理的应用程序包含一个主 JFrame,用户最终可能会从中打开另一个补充框架。我正在尝试实现应用程序的这种行为,即一旦主框架最小化,补充框架就会最小化(图标化)。

我正在考虑重写主框架的 setExtendedState 方法以捕获它被最小化的时刻,然后从那里触发属性更改事件,以便补充框架可以对其进行操作。

但我发现,不幸的是,被覆盖的 setExtendedState 永远不会被调用。

我将不胜感激任何实现所需行为的想法。下面是我用来测试的代码...

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);
    }
}

【问题讨论】:

    标签: java swing state jframe minimize


    【解决方案1】:

    只需将 WindowStateListener 添加到 MainFrame 即可使您的代码与属性更改侦听器一起使用:

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

    【讨论】:

    • 事实上,将WindowStateListener添加到补充框架中似乎更合适。这样就无需向主框架添加任何功能来实现所需的行为。
    【解决方案2】:

    我正在开发的应用程序 包含一个主 JFrame,从中 用户最终可能会打开另一个 补充框架

    应用程序通常设计为使用单个 JFrame。补充窗口是使用 JDialog 创建的。创建对话框时,请确保将框架指定为对话框的所有者。现在,当您对框架进行图标化/去图标化时,对话框会自动同步图标化。

    【讨论】:

    • 谢谢。我试过了,但是辅助窗口总是停留在主框架的顶部(即使我 setAlwaysOnTop(false);),在任务栏上不可见,并且不能自行最小化/最大化。
    猜你喜欢
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多