Maison 类库下载 java类库 GUI之 事件处理基础

GUI之 事件处理基础

Oct 20, 2016 am 10:38 AM
java

  事件处理可以简单地这么理解,当有一个事件产生,程序要根据这个事件做出响应。比如,我们做了一个可以通过按钮改变背景颜色的窗口,当我们点击按钮时便产生了一个事件,程序会根据这个事件来做出响应,也就是去改变背景的颜色。

  那么程序是怎样做出响应的呢?这就需要事件监听器ActionListener,这是一个接口,里面包含了actionPerformed方法(也就是根据事件去执行的操作),所以我们要实现这个接口(实现接口里的actionPerformed方法)做出一个监听器对象出来,并且用按钮来注册这个监听器对象,这样当按钮被点击的时候,就会调用这个监听器来执行响应了。

1.jpg1.jpg1.jpg

                                                                                                  运行结果

  代码(第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);
    }
}
Copier après la connexion

 在上述代码中,为了方便监听器调用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
Copier après la connexion

  代码存在一个缺陷,就是在构造按钮、添加按钮到面板、构造相应颜色的监听器和注册监听器的时候有代码复制的情况,为了避免代码复制,我们可以创建一个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
Copier après la connexion

  在代码中,监听器只被调用了一次,也就是在addActionListener()时。所以我们没有必要为监听器单独做一个类出来,而是只需在用到监听器时直接new一个ActionListener接口出来,并在花括号里实现接口方法即可。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo

See all articles