Heim > 类库下载 > java类库 > Grundlagen der GUI-Ereignisverarbeitung

Grundlagen der GUI-Ereignisverarbeitung

高洛峰
Freigeben: 2016-10-20 10:38:18
Original
1703 Leute haben es durchsucht

Die Ereignisverarbeitung kann einfach so verstanden werden. Wenn ein Ereignis auftritt, muss das Programm entsprechend diesem Ereignis reagieren. Zum Beispiel haben wir ein Fenster erstellt, das die Hintergrundfarbe über eine Schaltfläche ändern kann. Wenn wir auf die Schaltfläche klicken, wird ein Ereignis generiert, und das Programm reagiert entsprechend diesem Ereignis, d. h., um die Hintergrundfarbe zu ändern.

Wie reagiert das Programm? Dies erfordert den Ereignis-Listener ActionListener, eine Schnittstelle, die die Methode „actionPerformed“ (d. h. die auf dem Ereignis basierende Operation) enthält. Daher müssen wir diese Schnittstelle implementieren (die Methode „actionPerformed“ in der Schnittstelle implementieren), um ein Listener-Objekt zu erstellen . und verwenden Sie die Schaltfläche, um das Listener-Objekt zu registrieren, sodass der Listener aufgerufen wird, um die Antwort auszuführen, wenn auf die Schaltfläche geklickt wird.

Grundlagen der GUI-Ereignisverarbeitung Grundlagen der GUI-Ereignisverarbeitung Grundlagen der GUI-Ereignisverarbeitung

Ergebnisse ausführen

Code (Zeile 42 beginnt mit der Implementierung der Schnittstelle): Im obigen Code, um den Hörer zu erleichtern Um buttonPanel aufzurufen, wird ColorAction als interne Klasse von ButtonFrame verwendet. Wenn Sie die ColorAction-Klasse trennen, müssen Sie das buttonPanel an die ColorAction übergeben. Die Implementierung ist wie folgt:

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);
    }
}
Nach dem Login kopieren
Es gibt einen Fehler im Code, der die Schaltfläche erstellt und die Schaltfläche hinzufügt Das Panel erstellt den Listener der entsprechenden Farbe und registriert den Code. Um Codeduplizierungen zu vermeiden, können wir eine makeButton-Methode erstellen, um diese wiederholten Vorgänge einzuschließen.

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
Nach dem Login kopieren
Im Code wird der Listener nur einmal aufgerufen, nämlich bei addActionListener(). Daher müssen wir keine separate Klasse für den Listener erstellen. Stattdessen müssen wir bei Verwendung des Listeners nur direkt eine neue ActionListener-Schnittstelle erstellen und die Schnittstellenmethode in geschweiften Klammern implementieren.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage