-1

JButton を備えたメインの JFrame ウィンドウがあります。ボタンをクリックすると新しいウィンドウが開きますが、2 つ目のウィンドウを閉じようとすると、両方のウィンドウが閉じられます。私はいつも最初に開いてほしい。2 番目のウィンドウだけを閉じる方法はありますか? 助けてください!ありがとう!

編集:私の問題を示すために新しいコードを追加します。クラス GUI1 には、メイン フレームと、GUI2 フレームを閉じるボタンを持つ 2 番目のフレーム GUI2 を開くためのボタンがあります。解けないGUI2の締めの部分です。コードは単純で、テスト用です。

GUI1

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUI1 extends JFrame implements ActionListener{
JButton btn1;
Container contentPane;
public GUI1()
{
    setTitle("GUI 1");
    setResizable(false);
    setSize(600,300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    contentPane = getContentPane();
    contentPane.setLayout(new FlowLayout());
    btn1 = new JButton("Open GUI 2 frame");
    contentPane.add(btn1);
    btn1.setFocusable(false);
    btn1.addActionListener(this);
}
public void actionPerformed(ActionEvent event){
    if(event.getSource() == btn1)
    {
        GUI2 frame2 = new GUI2();
        frame2.setVisible(true);
    }
}
public static void main(String[] args) {
    GUI1 frame = new GUI1();
    frame.setVisible(true);
}
}

GUI2

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUI2 extends JFrame implements ActionListener {
Container contentPane;
JButton btn2;
public GUI2()
{
    setTitle("GUI 2");
    setResizable(false);
    setSize(400,200);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    contentPane = getContentPane();
    contentPane.setLayout(new FlowLayout());
    btn2 = new JButton("Close GUI 2 frame");
    contentPane.add(btn2);
    btn2.addActionListener(this);
}
public void actionPerformed(ActionEvent event){
    if(event.getSource() == btn2)
    {
        // Close GUI2 ??
    }
}
}
4

3 に答える 3

2

もう一度読んだ後、JFrame を作成して破棄する (または複数の JFrame をまったく使用しない) べきではないという他の人たちの意見に同意します。しかし、あなたが本当にその道を進みたいのなら、私はお勧めします:

  • 単一の JFrame を作成し、それへの参照をボタンがアクセスできる場所に保存します。
  • 「追加」ボタンが押されたときにフレームを表示します。
  • JFrame.HIDE_ON_CLOSE(exit on close)の代わりに使用3- マジック ナンバーを使用しないでください。
  • 他のボタンが押されたときにフレームを非表示にします。

更新:上記の提案をアーキテクチャに適用する手順は次のとおりです。

  • GUI1クラスにフィールドを追加し、private GUI2 frame一度だけ作成します (たとえば、GUI1 のコンストラクターで)。
  • フレームがすでに作成されているので、あなたactionPerformedだけを使用してください。frame.setVisible(true)
  • DISPOSE_ON_CLOSE必要に応じて、GUI2 を使用し続けることができると思いますが、HIDE_ON_CLOSEより適切です。
  • アクションリスナーを実装しているのGUI2はJFrameであるため、すでにそれへの参照がありますthisthis.setVisible(false)またはを使用しますsetVisible(false)
于 2012-05-28T12:07:56.780 に答える
2

JButton を備えたメインの JFrame ウィンドウがあります。ボタンをクリックすると新しいウィンドウが開きますが、2 つ目のウィンドウを閉じようとすると、両方のウィンドウが閉じられます。

1.実行時に大量のオブジェクトCardLayoutを作成するのではなく使用する、JFrames非常に悪い概念

2.HIDE_ON_CLOSE代わりに使うDISPOSE_ON_CLOSE

于 2012-05-28T12:08:52.457 に答える
0

変更:frame2.setDefaultCloseOperation(3);に変更するframe2.setDefaultCloseOperation(DISPOSE_ON_CLOSE);と、動作するはずです

于 2012-05-28T12:07:58.000 に答える