ホームページ  >  記事  >  类库下载  >  GUIイベント処理の基本

GUIイベント処理の基本

高洛峰
高洛峰オリジナル
2016-10-20 10:38:181648ブラウズ

イベント処理はこのように簡単に理解できます。イベントが発生すると、プログラムはそのイベントに応じて応答する必要があります。たとえば、ボタンで背景色を変更できるウィンドウを作成しました。ボタンをクリックするとイベントが発生し、プログラムはこのイベントに応じて、つまり背景色を変更します。

では、プログラムはどう反応するのでしょうか?これには、actionPerformed メソッド (つまり、イベントに基づいて実行される操作) を含むインターフェイスであるイベント リスナー ActionListener が必要です。そのため、リスナー オブジェクトを作成するには、このインターフェイスを実装する (インターフェイスに actionPerformed メソッドを実装する) 必要があります。 . を使用し、ボタンをクリックするとリスナーが呼び出されて応答が実行されるように、ボタンを使用してリスナー オブジェクトを登録します。

GUIイベント処理の基本GUIイベント処理の基本GUIイベント処理の基本

実行結果

コード (インターフェースを実装するための 42 行目から):

package buttonPanel;

import java.awt.*;
import java.awt.event.*; //事件监听器接口ActionListener的位置。
import javax.swing.*;

public class ButtonFrame extends JFrame {
    private ButtonPanel buttonPanel;
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;
    
    public ButtonFrame() {
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        setLocationByPlatform(true);
        
        //构造按钮
        JButton redButton = new JButton("RED");
        JButton yellowButton = new JButton("YELLOW");
        JButton blueButton = new JButton("BLUE");
        
        buttonPanel = new ButtonPanel();
        
        //添加按钮到面板
        buttonPanel.add(redButton);
        buttonPanel.add(yellowButton);
        buttonPanel.add(blueButton);
        
        add(buttonPanel);
        
        //构造对应颜色的动作监听器
        ColorAction redAction = new ColorAction(Color.red);
        ColorAction yellowAction = new ColorAction(Color.yellow);
        ColorAction blueAction = new ColorAction(Color.blue);
        
        //每个按钮注册对应的监听器
        redButton.addActionListener(redAction);                     
        yellowButton.addActionListener(yellowAction);
        blueButton.addActionListener(blueAction);
    }
    
    //为了方便调用buttonPanel,将ColorAction作为ButtonFrame的内部类。
    private class ColorAction implements ActionListener {
        private Color backgroundColor;
        public ColorAction(Color c) {
            backgroundColor = c;
        }
        public void actionPerformed(ActionEvent event) {
            buttonPanel.setBackground(backgroundColor);
        }
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new ButtonFrame();
                frame.setTitle("ColorButton");
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

class ButtonPanel extends JPanel {
    private static final int DEFAUT_WIDTH = 300;
    private static final int DEFAUT_HEIGHT = 200;

    @Override
    protected void paintComponent(Graphics g) {
        g.create();
        super.paintComponent(g);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(DEFAUT_WIDTH,DEFAUT_HEIGHT);
    }
}

上記のコードでは、リスナーが呼び出すのを容易にするために、 buttonPanel、ColorActionはButtonFrameの内部クラスとして使用されます。 。 ColorAction クラスを分離する場合は、ButtonPanel を ColorAction に渡す必要があります。実装は次のとおりです。

package buttonPanel2;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonFrame2 extends JFrame {
    private ButtonPanel buttonPanel;
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;
    
    public ButtonFrame2() {
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        setLocationByPlatform(true);
        
        JButton redButton = new JButton("RED");
        JButton yellowButton = new JButton("YELLOW");
        JButton blueButton = new JButton("BLUE");
        
        buttonPanel = new ButtonPanel();
        
        buttonPanel.add(redButton);
        buttonPanel.add(yellowButton);
        buttonPanel.add(blueButton);
        
        add(buttonPanel);
        
        //将此对象通过this传到ColorAction的构造器。
        ColorAction redAction = new ColorAction(this,Color.red);
        ColorAction yellowAction = new ColorAction(this,Color.yellow);
        ColorAction blueAction = new ColorAction(this,Color.blue);
        
        redButton.addActionListener(redAction);
        yellowButton.addActionListener(yellowAction);
        blueButton.addActionListener(blueAction);
    }
    
    public void setButtonPanelsBackground(Color backgroundColor) {
        buttonPanel.setBackground(backgroundColor);
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new ButtonFrame2();
                frame.setTitle("ColorButton");
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

class ColorAction implements ActionListener {
    private ButtonFrame2 buttonFrame;
    private Color backgroundColor;
    
    //通过构造器的方法把ButtonFrame2对象传过来,这个对象包含了成员变量buttonPanel,以便对其更换背景色。
    public ColorAction(ButtonFrame2 buttonFrame,Color c) {
        this.buttonFrame = buttonFrame; //this.buttonFrame只是对象管理者,管理的还是ButtonFrame的对象frame。
        backgroundColor = c;
    }
    public void actionPerformed(ActionEvent event) {
        buttonFrame.setButtonPanelsBackground(backgroundColor);
        //这是我们在ButtonFrame2中添加的新方法。
    }
}

class ButtonPanel extends JPanel {
    private static final int DEFAUT_WIDTH = 300;
    private static final int DEFAUT_HEIGHT = 200;
    
    public ButtonPanel() {
        setBackground(Color.pink);
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.create();
        super.paintComponent(g);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(DEFAUT_WIDTH,DEFAUT_HEIGHT);
    }
}

ButtonFrame2

コードに欠陥があります。つまり、ボタンを構築する際にコードが重複しています。コードの重複を避けるために、次のように、これらの繰り返し操作を含める makeButton メソッドを作成できます:

package buttonPanel3;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonFrame3 extends JFrame {
    private ButtonPanel buttonPanel;
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;
    
    public ButtonFrame3() {
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        setLocationByPlatform(true);
        
        buttonPanel = new ButtonPanel();        
        add(buttonPanel);
        
        makeButton("RED",Color.red);
        makeButton("YELLOW",Color.yellow);
        makeButton("BLUE",Color.blue);
    }
    
    //为了避免代码重复,我们将重复的操作放在这个函数里。
    public void makeButton(String name,final Color bg) {
        JButton button = new JButton(name);
        buttonPanel.add(button);
        button.addActionListener(new ActionListener() { //可以new一个接口出来,但是后面必须接花括号实现内部方法。
            public void actionPerformed(ActionEvent event) {
                buttonPanel.setBackground(bg);
            }
        });
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new ButtonFrame3();
                frame.setTitle("ColorButton");
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

class ButtonPanel extends JPanel {
    private static final int DEFAUT_WIDTH = 300;
    private static final int DEFAUT_HEIGHT = 200;

    @Override
    protected void paintComponent(Graphics g) {
        g.create();
        super.paintComponent(g);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(DEFAUT_WIDTH,DEFAUT_HEIGHT);
    }
}

ButtonFrame3

コードでは、リスナーのみが呼び出されます。 1 回、つまり addActionListener() のときに。したがって、リスナー用に別のクラスを作成する必要はなく、リスナーを使用するときに新しい ActionListener インターフェイスを直接作成し、中かっこでインターフェイス メソッドを実装するだけです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。