1

誰もが私の問題を理解できるように、私の問題を示す簡単な GUI プログラムを作成しました。まず、分析するコードを配置します。そして、下のビデオを見て、私が何を尋ねようとしてきたかを確認してください。動画はほんの数秒で、読み込みに時間がかかりませんのでご了承ください。

メニュー JFrame:

    //This is a Menu JFrame Window
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;

    public class Menu extends JFrame implements GlobalVariables{

        public Menu(){
            clickMe.setBounds(75, 50, 100, 50);
            clickMe.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e){
                    dispose();
                    SubMenu sm = new SubMenu();
                    sm.subMenuProperties();
                }
            });
            add(clickMe);

        }

        void menuProperties(){    
            setLayout(null);
            setSize(250,175);
            setVisible(true);        
            setResizable(false);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        }

        public static void main(String[] args) {
            Menu m = new Menu();
            m.menuProperties();
        }
    }

サブメニュー JFrame:

    //This is a SubMenu JFrame Window
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;

    public class SubMenu extends JFrame implements GlobalVariables{

        public SubMenu(){
            clickMe2.setBounds(75, 50, 100, 50);
            clickMe2.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e){
                    dispose();
                    Menu m = new Menu();
                    m.menuProperties();
                }
            });
            add(clickMe2);

        }

        void subMenuProperties(){    
            setLayout(null);
            setSize(250,175);
            setVisible(true);        
            setResizable(false);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        }

        public static void main(String[] args) {
            SubMenu sm = new SubMenu();
            sm.subMenuProperties();
        }    
    }

そして、「GlobalVariables」の実装が何であるか疑問に思っている場合は、次のとおりです。

    import javax.swing.*;

    public interface GlobalVariables{    
        //Menu Variable
        JButton clickMe = new JButton("SubMenu");
        //SubMenu Variable
        JButton clickMe2 = new JButton("Back");   
    }

さて、このビデオでは、JFrame が乗算されるという意味を説明します。

http://www.youtube.com/watch?v=iCavg_1SqvY

*ビデオをご覧になった方は、JFrame が乗算されていると言っている意味がわかります。これを何日も分析してきましたが、間違いを特定できません。私の間違いを正確に指摘していただければ、私はとても感謝しています。コードのコメントや調整も受け付けています。コードの構造が再構築されないことを願っています。前に述べたように、私の問題を示すためだけにこの単純な GUI を作成しましたが、少なくとも、GUI 作成でこの種のアプローチを使用して完成を待っているプログラム全体があります。私を助けてください。

4

2 に答える 2

1

コードに問題が見つかりました。actionPerformedメソッドのActionListenerを削除する必要があります。ボタンがクリックされるたびに、コードは新しいActionListenerオブジェクトを作成し、ボタンに関連付けられます。後続のクリックはこの重複アクションリスナーによって実行され、最終的にはより多くのJFrameを取得します。

行dispose()の後に、両方のクラスのactionPerformed(ActionEvent e)メソッドに次の行を追加します。これで問題が解決するはずです

Menu.java
clickMe.removeActionListener(this);
......
SubMenu.java
clickMe2.removeActionListener(this)

;

于 2013-02-13T00:33:10.240 に答える
1

これら 2 つのクラスはどちらも JFrame のサブクラスであり、新しいウィンドウが表示されます。

Menu という名前のボタンには、Menu をインスタンス化するボタン「clickMe2」を含む SubMenu をインスタンス化するボタン「clickMe」が含まれています。これにより、各クラスのインスタンスがさらに作成される無限ループが作成されます。つまり、より多くのフレームを作成します。

クラス SubMenu で、次の行を削除します。

Menu m = new Menu();
m.menuProperties();

Swing の使用を開始するために、Oracleには優れたチュートリアルがあります。

于 2013-02-12T12:36:50.057 に答える