0

#私が投稿している問題では、この中で1行目と2行目に記載されているコードを理解できません.私にとって最も紛らわしいのは、1 行目と 2 行目にある {JB1.addActionListener(this)} の構文で、「これ」の役割は何なのかということです。そして、この構文全体がどのように機能するか...詳細。#

 import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.*;



    public class frametest1_1 implements ActionListener
    {
        JLabel JL;
        public frametest1_1()
        {
            //create a JFrame container
            JFrame JF=new JFrame("A BUTTON");

            //Frame Layout This is contained in Java .awt.*;  "ON USING THIS OPTION OUR BUTTON AND OTHER COMPONENT ARE ADJUSTED IN THE FRAME AUTOMATICALLY"
            JF.setLayout(new FlowLayout());

            //set the size of the container
            JF.setSize(200, 200);

            //set visible
            JF.setVisible(true);

            //make button
            JButton JB1=new JButton("FIRST");
            JButton JB2=new JButton("SECOND");

            //add button to the JFrame container
            JF.add(JB1);
            JF.add(JB2);

            //Create and add Label to the JFrame container
            JL=new JLabel("PRESS A BUTTON");
            JF.add(JL);

            //set action command :now this will help in determining that which button is presses, is it FIRST or SECOND
            JB1.setActionCommand("one");
            JB2.setActionCommand("two");

            //The action responded is added to the actionlistener
            JB1.addActionListener((ActionListener) this); // line 1
            JB2.addActionListener((ActionListener) this); // line 2
        }   

        public void actionPerformed(ActionEvent ae) 
        {

            if(ae.getActionCommand().equals("one"))
                JL.setText("First Button Pressed");     // to set text on the label
            else
                JL.setText("Second button Pressed");    // to set the text on the label

        }
        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    new frametest1_1();
                }
            });
        }
    }
4

3 に答える 3

1

1.を考慮してくださいListener is someone who reacts to some action

2.ActionListenerは、 という名前のコールバック メソッドを持つインターフェイスであり、その内部には、コントローラーで特定のアクションが実行されたときに実行されるコードがあります。actionPerformed

3.この行のJB1.addActionListener((ActionListener) this);意味は次のとおりです。

   JB1 - Button
   ActionListener - Interface
   addActionListener - Registering the Button with the Listener.

4. addActionListenerを(ここではその ActionListener)にバインド/登録します。ButtonListener

5.MVCアーキテクチャではButton is the controller、特定のアクションが実行されると、誰が特定のことを実行するように通知されるかは、それをリスナーに登録することによって行われます。

6.そして、このリスナーには、リスナーを実装するクラスによってオーバーライドさcallbackれるメソッドがあります。

7.さらに、あなたの例では、このようにすることもできます... JB1.addActionListener(this);

于 2012-07-24T11:20:23.850 に答える
1

「this」は、run() メソッドで構築されたインスタンスである、囲んでいるクラス (frametest1_1) の現在のインスタンスを参照します。

「this」についてさらに読む: this キーワードの使用

于 2012-07-24T11:21:38.220 に答える
-1

Provided code is terribly ugly from object-oriented design point of view - hence your confusion. It's definitely bad idea to have one class responsible for:

  • containing main method
  • holding references to JFrame components (i.e. JLabel)
  • implementation of ActionListener concept

thus violating Single responsibility principle, though such ugly examples can be found even in official tutorials on Swing.

Slightly better implementation of exactly the same functionality would be the following:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class frametest1_1 {

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

    public static void runFrameTest() {
        //create a JFrame container
        JFrame JF=new JFrame("A BUTTON");

        //Frame Layout This is contained in Java .awt.*;  "ON USING THIS OPTION OUR BUTTON AND OTHER COMPONENT ARE ADJUSTED IN THE FRAME AUTOMATICALLY"
        JF.setLayout(new FlowLayout());

        //set the size of the container
        JF.setSize(200, 200);

        //set visible
        JF.setVisible(true);

        //make button
        JButton JB1=new JButton("FIRST");
        JButton JB2=new JButton("SECOND");

        //add button to the JFrame container
        JF.add(JB1);
        JF.add(JB2);

        //Create and add Label to the JFrame container
        final JLabel JL=new JLabel("PRESS A BUTTON");
        JF.add(JL);

        //set action command :now this will help in determining that which button is presses, is it FIRST or SECOND
        JB1.setActionCommand("one");
        JB2.setActionCommand("two");

        ActionListener labelUpdater = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {               
                if(ae.getActionCommand().equals("one"))
                    JL.setText("First Button Pressed");     // to set text on the label
                else
                    JL.setText("Second button Pressed");    // to set the text on the label             
            }
        };
        //The action responded is added to the actionlistener
        JB1.addActionListener(labelUpdater); // line 1
        JB2.addActionListener(labelUpdater); // line 2
    }

}

Hope this helps in understanding ...

于 2012-07-24T11:58:51.007 に答える