0

私はJava Swing開発の初心者で、次の問題があります。

Swing JDesktopフレームワークを使用するアプリケーションに取り組んでいます。

したがって、次の2つのクラスがあります。

1) GUI.java :

package com.test.login2;

import org.jdesktop.application.SingleFrameApplication;


public class GUI extends SingleFrameApplication {

    // Estensione di JFrame:
    private MainFrame mainFrame = null;

    @Override
    protected void startup() {
        System.out.println("GUI ---> startUp()");
        mainFrame = new MainFrame();
        mainFrame.setVisible(true);

    }

    // Save session state for the component hierarchy rooted by the mainFrame:
    @Override
    protected void shutdown() {
        System.out.println("ShutDown event intercepted by the GUI ---> sutdown() method");

    }

    public static void main(String[] args) {

        System.out.println("GUI ---> main()");

        /* Creates an instance of the specified Application subclass (SingleFrameApplication), 
         * sets the ApplicationContext application property, and then calls the new Application's startup method. 
         */
        launch(GUI.class, args);

    }

}

このクラスでわかるように、この操作を単純に実行するmain()メソッドがあります。

launch(GUI.class, args);

公式ドキュメントを読む: launch() doc

指定された Application サブクラスのインスタンスを作成し、ApplicationContext アプリケーション プロパティを設定してから、新しい Application の起動メソッドを呼び出します。launch メソッドは通常、アプリケーションのメインから呼び出されます。applicationClass コンストラクターとスタートアップ メソッドは、イベント ディスパッチ スレッドで実行されます。

したがって、startup()メソッドが実行され、新しいメインフレームオブジェクトが作成されて表示されます。

2) したがって、これはMainFrameコードです (これは単純に従来の Swing JFrameを拡張したものです)。

package com.test.login2;

import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import com.test.login.LoginFrame;

import net.miginfocom.swing.MigLayout;


public class MainFrame extends JFrame {

    private static final int FIXED_WIDTH = 1000;
    private static final Dimension INITAL_SIZE = new Dimension(FIXED_WIDTH, 620);

    private final Action actionLogOut = new AbstractAction() {
        {
            putValue(Action.NAME, ("LogOut"));
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            System.out.println("MainWindows ---> actionPerformed()");
            JButton button = (JButton)e.getSource();
            Window window = SwingUtilities.windowForComponent(button);
            //window.setVisible(false); 
            //window.dispose();

        }
    };

    public MainFrame() {
        super();

        setPreferredSize(INITAL_SIZE);
        setResizable(false);

        setTitle("My Application");
        setLayout(new MigLayout("fill"));

        add(new JButton(actionLogOut));     // Add the LogOut JButton to the current MainFrame object

        pack();
        setLocationRelativeTo(null);        // Center the window

    }


}

この段階では、JButtonと関連リスナーの存在はそれほど重要ではありません。

私の問題は次のとおりです。

GUI.javaクラスでわかるように、 shutdown()メソッドが定義されています ( SingleFrameApplication抽象クラスで定義されています)。

shutdown() メソッドのドキュメント

ドキュメントを読む:

mainFrame をルートとするコンポーネント階層のセッション状態を保存します。

したがって、GUI.javaクラスの main() メソッドは、 MainFrameオブジェクトを作成して表示するstartup()メソッドを実行する操作を実行します (ここまでは明らかです)。

次に、X ボタン (JFrame を閉じるボタン) をクリックすると、 ( GUI.javaクラスの) shutdown()メソッドが実行されます。このイベントを傍受できず、これは私にとって大きな問題です

誰かが私を助けることができますか?

TNX

アンドレア

4

1 に答える 1

0

このようなウィンドウリスナーを使用します。MainFrame クラスのコンストラクターでこの権利を使用できます。

addWindowListener(new WindowAdapter() {

        @Override
        public void windowClosing(WindowEvent e) {
            //do all your saving
            System.exit(0);
        }
    });

System.exit(0); に注意してください。コマンドは、アプリケーション全体を閉じます。したがって、この正確なコードは、アプリケーション全体を閉じずに jframe だけを閉じたい場合には使用しないでください。

于 2013-11-13T14:12:09.623 に答える