SwingのフォームとListenerを分離する方法
初心者の方、よろしくお願いします.
個人的にはデスクトップのウィジェットに興味があり、暇なときは暇なときにswingでウィジェットを書いてみたいと思っています.そこでいろいろなドキュメントを探して参考にします.多くのコードがフォームクラスとリスナークラスを一緒に置いていることに気づきました.このようにひげと眉をつかんで、初心者の私に読むのが大変です.そして、このコードは初心者の私でも維持すれば災難になることを知っています.一緒に書くのが悪い以上、分かればいいじゃないか.
簡単なことだと思っていたのに、操作が一波三折した.まず,元の混在コードを別々に2つのクラスに書き,対応するコンポーネントにリスナーを加える.それから、問題が来ました:多くのコンポーネント、どのようにリスナーを加えるべきですか?各リスナーに1つのクラス?!これは怖いでしょう.いっそ私を切ってください.解決策があるかどうか探してみます.ははは、setActionCommand()とgetActionCommand()という有用な方法を見つけました.この方法があれば、各コンポーネントに「コマンドラベル」を付けることができます.「クリア」ボタンに次のように設定します.
これにより,リスナーのメソッドactionPerformed()において,条件判定文を用いてクラス別の実行に対応するメソッドを分類することができる.
次に、「クリア」を実現する動作を書きます.「クリア」ボタンをクリックし、入力ボックスをクリア(JTextField)の内容です.質問がまた来ました:これはフィードバックが必要な問題で、コードを分けるだけでは役に立たないでしょう.リスナーがフォームを操作できるようにするには、フォームを取得しなければなりません.つまり、リスナーにフォーム変数を保存しなければなりません.この考え方に従って、リスナーにフォームオブジェクトをnewします.3回5回2を除いて書き終わりますこのコードは、実行されます.エラー:
スタックオーバーフロー?!チェックしてください.フォームクラスにnewが1つのリスナークラス、リスナークラスにnewが1つのフォームクラスとなっています.このように交互にnewを続けると当然ループインスタンス化対象が死んでしまう.どうすればいいの?
いろいろなルートの資料を調べて、大神に聞いたことがあります.やっと解決策を見つけました:リスナークラスではフォームクラスが必要ですが、newの方法でインスタンス化するのではなく、パラメータのある構造方法の形式を採用して、フォームクラスをパラメータの形式でリスナークラスに伝えます.テストして、実行して、入力ボックスに文字を入力して、“クリア”をクリックして、成功しました!
まとめ:明確なコードのやり方は良い習慣です. 問題に遭遇したのは、まず資料を調べて、解決した案があるかどうかを見ることです. プログラミングの考え方を真剣に理解し、「この問題に遭遇したら、私は目的を達成しなければならない.理論的にはどうすればいいのか」と話した. 自分で解決できない問題に出会ったら、必ずタイムリーにいろいろな方法で達人に聞かなければならない. の2つのクラスは、構造方法で互いにインスタンス化することができず、サイクルインスタンス化をもたらす. もし2つのA,Bクラスが互いに相手のメソッドを呼び出す必要がある場合、BにパラメータAの構造メソッドを書き、Aにパラメータ付きBをnewし、自身をパラメータとして渡す.
本文は“私のjava成長ノート”のブログから出て、転載して作者と連絡してください!
個人的にはデスクトップのウィジェットに興味があり、暇なときは暇なときにswingでウィジェットを書いてみたいと思っています.そこでいろいろなドキュメントを探して参考にします.多くのコードがフォームクラスとリスナークラスを一緒に置いていることに気づきました.このようにひげと眉をつかんで、初心者の私に読むのが大変です.そして、このコードは初心者の私でも維持すれば災難になることを知っています.一緒に書くのが悪い以上、分かればいいじゃないか.
簡単なことだと思っていたのに、操作が一波三折した.まず,元の混在コードを別々に2つのクラスに書き,対応するコンポーネントにリスナーを加える.それから、問題が来ました:多くのコンポーネント、どのようにリスナーを加えるべきですか?各リスナーに1つのクラス?!これは怖いでしょう.いっそ私を切ってください.解決策があるかどうか探してみます.ははは、setActionCommand()とgetActionCommand()という有用な方法を見つけました.この方法があれば、各コンポーネントに「コマンドラベル」を付けることができます.「クリア」ボタンに次のように設定します.
clean=new JButton("Clean");
clean.setActionCommand("clean");
これにより,リスナーのメソッドactionPerformed()において,条件判定文を用いてクラス別の実行に対応するメソッドを分類することができる.
次に、「クリア」を実現する動作を書きます.「クリア」ボタンをクリックし、入力ボックスをクリア(JTextField)の内容です.質問がまた来ました:これはフィードバックが必要な問題で、コードを分けるだけでは役に立たないでしょう.リスナーがフォームを操作できるようにするには、フォームを取得しなければなりません.つまり、リスナーにフォーム変数を保存しなければなりません.この考え方に従って、リスナーにフォームオブジェクトをnewします.3回5回2を除いて書き終わりますこのコードは、実行されます.エラー:
Exception in thread "main" java.lang.StackOverflowError
at java.awt.geom.Rectangle2D.<init>(Rectangle2D.java:511)
at java.awt.Rectangle.<init>(Rectangle.java:211)
at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222)
at java.awt.Window.init(Window.java:497)
at java.awt.Window.<init>(Window.java:536)
at java.awt.Frame.<init>(Frame.java:420)
at javax.swing.JFrame.<init>(JFrame.java:224)
スタックオーバーフロー?!チェックしてください.フォームクラスにnewが1つのリスナークラス、リスナークラスにnewが1つのフォームクラスとなっています.このように交互にnewを続けると当然ループインスタンス化対象が死んでしまう.どうすればいいの?
いろいろなルートの資料を調べて、大神に聞いたことがあります.やっと解決策を見つけました:リスナークラスではフォームクラスが必要ですが、newの方法でインスタンス化するのではなく、パラメータのある構造方法の形式を採用して、フォームクラスをパラメータの形式でリスナークラスに伝えます.テストして、実行して、入力ボックスに文字を入力して、“クリア”をクリックして、成功しました!
まとめ:
本文は“私のjava成長ノート”のブログから出て、転載して作者と連絡してください!