メインアプリケーションJFrameが最小化されると、補足JFrameを最小化する

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

質問

私が取り組んでいるアプリケーションには、メインのJFrameが含まれており、ユーザーは最終的に別の補足フレームを開く可能性があります。メインフレームが最小化されるとすぐに、補足フレームが最小化(アイコン化)されるアプリのそのような動作を実装しようとしています。

メインフレームのsetextedentedStateメソッドをオーバーライドして、最小化される瞬間をキャプチャし、そこから補足フレームが作用するようにプロパティ変更イベントを発射することを考えていました。

しかし、残念なことに、オーバーライドされたsetextedentStateが呼び出されることはないことを発見しました。

私は、望ましい行動を達成するというアイデアを大いに感謝します。以下は私がテストに使用したコードです...

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);
    }
}
役に立ちましたか?

解決

WindowStateListenerをメインフレームに追加して、プロパティ変更リスナーとコードを機能させるだけです。

addWindowStateListener(new WindowStateListener() {

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

他のヒント

私が取り組んでいるアプリケーションにはメインJFrameが含まれており、ユーザーは最終的に別の補足フレームを開く可能性があります

アプリケーションは通常、単一のJFrameを使用するように設計されています。補足ウィンドウは、JDialogを使用して作成されます。ダイアログを作成するときは、ダイアログの所有者としてフレームを指定してください。これで、フレームを象徴/デコン化すると、ダイアログは自動的に同期してアイコン化されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top