2016-04-20 21 views
1

私は現在Eclipseのドラッグ&ドロップ機能を使用していますが、デフォルトでJFrameに付属しているsetVisible(false);というアプリケーションウィンドウを1つ持っていますが、JPanelで作成したJFrame 。ボタンでJFrameを閉じる

extendのため、私はsetVisible(false or true);には全く影響を及ぼしませんが、それでもなお真です。

マイコード:

private JPanel contentPane; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       LibrarianMenu frame = new LibrarianMenu(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public LibrarianMenu() { 
    setTitle("Librarian"); 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    setBounds(100, 100, 385, 230); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 
    . 
    . 
    . so on 

ここで私は私のボタンを実行しようとしています:

btnLogout.addActionListener(
      new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        LibrarianMenu frame = new LibrarianMenu(); 
        frame.setVisible(false); 
       } 
      }); 

そのための任意のソリューション?

+0

は、コンパイルの例を投稿してください。どちらの方法でも、新しく作成されたオブジェクトを参照するリファレンスではなく、 'setVisible(true)'と同じリファレンスで 'setVisible(false)'を呼び出す必要があります。 – Timmos

+1

メインクラスのonClick、create it asフィールドにLibrarianMenuを作成してから、setVisibleをfalseに設定しないでください。ボタンをクリックすると別のLibrarianMenuが作成され、最初のものがそのまま残ります。 –

+0

'SwingUtilities.windowForComponent(btnLogout).setVisible(false)'? – MadProgrammer

答えて

2

これが起こっているすべてのためにボタンを押すと、そのフレームの新しいインスタンスが作成されます。ここにあなたのコードが更新されます

static LibrarianMenu frame ; 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       frame = new LibrarianMenu(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

そしてログアウトボタンイベントは次のようにする必要があります。でも、あなたのコード内のクラス定義がないため

btnLogout.addActionListener(
     new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       frame.setVisible(false); 
      } 
     }); 
+0

ありがとう。解決! – nix

+1

@nix '静的'は、「見た目が良い」解決策の1つですが、あなたを暗い同盟国に導き、無意識に打ちのめされ、あなたの財布を盗んでしまいます。 – MadProgrammer

3

Runnable内にフレームを作成するので、そのスコープは実行可能な範囲に制限されます。 LibrarianMenuの新しいインスタンスを宣言せずに次に

private JPanel contentPane; 
private LibrarianMenu frame; 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       frame = new LibrarianMenu(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

falseにのsetVisible:そのようにのような、実行可能な範囲内にそれを初期化し、実行可能な外の変数を宣言してみ

btnLogout.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
      frame.setVisible(false); 
    } 
}); 
+0

ありがとうございます。解決! – nix

+0

@nixこれで問題が解決した場合は、正しい答えとしてマークしてください。ありがとう:) – GingerDeadshot

関連する問題