2012-03-15 4 views
2

別のJFrameを表示するボタンがあるJFrameを開発しています。 2番目のJFrameでは、このフレームを非表示にするためにWindowsClosingイベントをオーバーライドしたいが、すべてのアプリケーションを閉じない。だから私はこのように実行します。JFrameでwindowsClosingイベントをオーバーライドする方法

第二のJFrame

addWindowListener(new java.awt.event.WindowAdapter() { 
    public void windowClosing(java.awt.event.WindowEvent evt) { 
     formWindowClosing(evt); 
    } 
}); 

private void formWindowClosing(java.awt.event.WindowEvent evt) { 
    this.dispose(); 
} 

が、それでも近いアプリケーションでは、私はWindows上でxボタンをクリックしたとき。どうして?手伝って頂けますか?

私はいくつかの情報を持つJFrameのは、最初のJFrameからの操作中に、それに追加することを再び表示する必要があるため、私は

setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

を使用することはできません。だから、私は属性visible falseの2番目のJFrameを初期化します。私が別のJFrameによって2番目の瞬間に追加された情報を失う場合、私は処分を使用します。だから私は使用する

private void formWindowClosing(java.awt.event.WindowEvent evt) { 
    this.setVisible(false); 
} 

しかし、それでも私のアプリ全体を終了し続けます。

答えて

2

非常に適切な@JBNizetで説明されているように、WindowListenerのない部分に新しいコードを追加します。デフォルトの動作は、単に何も失われることはありません、ウィンドウを隠し、あなたは、単にそれを戻すために必要があり、それはそのまま、以下の残る内のすべての値は、さらに、ヘルプのためのサンプルプログラムです:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TwoFrames 
{ 
    private SecondFrame secondFrame; 
    private int count = 0; 

    private void createAndDisplayGUI() 
    { 
     JFrame frame = new JFrame("JFRAME 1"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 

     secondFrame = new SecondFrame(); 
     secondFrame.createAndDisplayGUI(); 
     secondFrame.tfield.setText("I will be same everytime."); 

     JPanel contentPane = new JPanel(); 
     JButton showButton = new JButton("SHOW JFRAME 2"); 
     showButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       secondFrame.tfield.setText(secondFrame.tfield.getText() + count); 
       count++; 
       if (!(secondFrame.isShowing())) 
        secondFrame.setVisible(true); 
      } 
     }); 

     frame.add(contentPane, BorderLayout.CENTER); 
     frame.add(showButton, BorderLayout.PAGE_END); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TwoFrames().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

class SecondFrame extends JFrame 
{ 
    private WindowAdapter windowAdapter; 
    public JTextField tfield; 

    public void createAndDisplayGUI() 
    { 
     setLocationByPlatform(true); 

     JPanel contentPane = new JPanel(); 

     tfield = new JTextField(10); 

     addWindowListener(windowAdapter); 
     contentPane.add(tfield); 

     getContentPane().add(contentPane); 
     setSize(300, 300);  
    } 
} 

は何これです

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TwoFrames 
{ 
    private SecondFrame secondFrame; 

    private void createAndDisplayGUI() 
    { 
     JFrame frame = new JFrame("JFRAME 1"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 

     secondFrame = new SecondFrame(); 
     secondFrame.createAndDisplayGUI(); 
     secondFrame.tfield.setText("I will be same everytime."); 

     JPanel contentPane = new JPanel(); 
     JButton showButton = new JButton("SHOW JFRAME 2"); 
     showButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       if (!(secondFrame.isShowing())) 
        secondFrame.setVisible(true); 
      } 
     }); 

     frame.add(contentPane, BorderLayout.CENTER); 
     frame.add(showButton, BorderLayout.PAGE_END); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TwoFrames().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

class SecondFrame extends JFrame 
{ 
    private WindowAdapter windowAdapter; 
    public JTextField tfield; 

    public void createAndDisplayGUI() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationByPlatform(true); 

     JPanel contentPane = new JPanel(); 

     tfield = new JTextField(10); 

     windowAdapter = new WindowAdapter() 
     { 
      public void windowClosing(WindowEvent we) 
      { 
       setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
      } 
     }; 

     addWindowListener(windowAdapter); 
     contentPane.add(tfield); 

     getContentPane().add(contentPane); 
     setSize(300, 300);  
    } 
} 
+1

hehe、あまりにも真、私はあなたのようなコードを書くことができたらいいなあ。その日が近くにあることを願って: –

+0

これは私が必要とするものです!!!!近くに隠れて...:Pありがとう! :D – JackTurky

+1

@JackTurky:あなたの歓迎と笑顔:-) –

2

あなたは完全にリスナーを回避し、デフォルト値はHIDE_ON_CLOSEですので、あなたが望む動作がデフォルトの動作でなければならないこと

setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

注意を使用することができます。アプリケーションを終了する別のリスナーを登録した可能性があります。

http://docs.oracle.com/javase/6/docs/api/javax/swing/JFrame.html#setDefaultCloseOperation%28int%29

+0

edit plsを参照してください。 – JackTurky

+1

デフォルトのクローズ操作は、リスナーの操作とまったく同じです。フレームを非表示にします。私はなぜこのフレームを再利用できなかったのか分かりません。 –

+0

@JBNizet:私はこの答えを2回以上upvoteすることができます、あなたが説明したいと思ったように思える、OPはそれを理解できませんでしたが、私はちょうどあなたが彼に言っていたことを実現しました。 'WindowListener'部分は必要ありません。私は 'Jframe'のデフォルトの動作については決して読んでいませんが、私に啓示されたdoc: –

4

あなたはJFrameを非表示にする場合は、その後、より良い方法JFrame.EXIT_ON_CLOSEがためcalllように、現在のJVMインスタンスsimlairをteminating、適切例えばDefaultCloseOperations(JFrame.HIDE_ON_CLOSE)を上書きすることになる、新しいコンテナの使用JDialogのために、新しいJFrameを作成しないでくださいを参照してください。 System.exit(int)

EDIT

but it still continue to terminate my entire app. 

1)その後、別の問題が存在しなければならない、あなたのC頌歌多分それはだJDialogの代わりJFrame

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class ClosingFrame extends JFrame { 

    private JMenuBar MenuBar = new JMenuBar(); 
    private static JFrame frame = new JFrame(); 
    private static JFrame frame1 = new JFrame("DefaultCloseOperation(JFrame.HIDE_ON_CLOSE)"); 
    private static final long serialVersionUID = 1L; 
    private JMenu File = new JMenu("File"); 
    private JMenuItem Exit = new JMenuItem("Exit"); 

    public ClosingFrame() { 
     File.add(Exit); 
     MenuBar.add(File); 
     Exit.addActionListener(new ExitListener()); 
     WindowListener exitListener = new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       frame.setVisible(false); 
       /*int confirm = JOptionPane.showOptionDialog(frame, 
       "Are You Sure to Close this Application?", 
       "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
       JOptionPane.QUESTION_MESSAGE, null, null, null); 
       if (confirm == JOptionPane.YES_OPTION) { 
       System.exit(1); 
       }*/ 
      } 
     }; 
     JButton btn = new JButton("Show second JFrame"); 
     btn.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       frame1.setVisible(true); 
      } 
     }); 
     frame.add(btn, BorderLayout.SOUTH); 
     frame.addWindowListener(exitListener); 
     frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
     frame.setJMenuBar(MenuBar); 
     frame.setPreferredSize(new Dimension(400, 300)); 
     frame.setLocation(100, 100); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private class ExitListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int confirm = JOptionPane.showOptionDialog(frame, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == JOptionPane.YES_OPTION) { 
       System.exit(1); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ClosingFrame cf = new ClosingFrame(); 
       JButton btn = new JButton("Show first JFrame"); 
       btn.addActionListener(new ActionListener() { 

        public void actionPerformed(ActionEvent e) { 
         frame.setVisible(true); 
        } 
       }); 
       frame1.add(btn, BorderLayout.SOUTH); 
       frame1.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
       frame1.setPreferredSize(new Dimension(400, 300)); 
       frame1.setLocation(100, 400); 
       frame1.pack(); 
       frame1.setVisible(true); 
      } 
     }); 
    } 
} 
+0

編集plsを見てください:) :) – JackTurky

+0

@JackTurkyここに私の編集を見てください – mKorbel

+0

私は私がしなかったと思います私の質問をよく説明してください...ユーザーがウィンドウを閉じるかどうかを決めるダイアログを作成したくありません。しかし、私はそれを隠したいだけです。私がthis.setVisible(false)を設定するボタンのように。 – JackTurky

1

を使用)I'BはDefaultCloseOperations(JFrame.HIDE_ON_CLOSE)

3を優先)

public void windowClosing(WindowEvent e) { 

2 APIから別のJFrameまたはformWindowClosing <>WindowClosing、使用実装メソッドを呼び出しますセットアップコードをもう少し見ることなく、何が起こっているのかを正確に特定するのは難しいですが、defaultCloseOpが原因である可能性がありますEXIT_ON_CLOSEに設定されます。

ここでは、構造が少し異なりますが、探しているプロパティを表示するデモへのリンクです。見てください:http://docs.oracle.com/javase/tutorial/uiswing/examples/components/FrameworkProject/src/components/Framework.java

+0

質問に対して与えられた編集で、この答えは間違っています。 – Michael

関連する問題