> 类库下载 > java类库 > GUI 이벤트 처리 기본 사항

GUI 이벤트 처리 기본 사항

高洛峰
풀어 주다: 2016-10-20 10:38:18
원래의
1707명이 탐색했습니다.

이벤트 처리는 이벤트가 발생하면 이 이벤트에 따라 프로그램이 응답해야 한다는 의미로 간단히 이해할 수 있습니다. 예를 들어 버튼을 통해 배경색을 변경할 수 있는 창을 만들었는데, 버튼을 클릭하면 이벤트가 발생하고 프로그램은 이 이벤트에 따라 반응, 즉 배경색을 변경하게 됩니다.

그러면 프로그램은 어떻게 반응하나요? 이를 위해서는 actionPerformed 메소드(즉, 이벤트를 기반으로 수행되는 작업)를 포함하는 인터페이스인 이벤트 리스너 ActionListener가 필요하므로 이 인터페이스를 구현(인터페이스에 actionPerformed 메소드 구현)하여 리스너 객체를 만들어야 합니다. . 버튼을 사용하여 리스너 객체를 등록하면 버튼을 클릭할 때 리스너가 호출되어 응답을 수행합니다.

GUI 이벤트 처리 기본 사항 GUI 이벤트 처리 기본 사항 GUI 이벤트 처리 기본 사항

결과 실행

코드(라인 42는 인터페이스 구현을 시작합니다): 위 코드에서는 청취자를 용이하게 하기 위해 ButtonPanel을 호출하기 위해 ColorAction을 ButtonFrame의 내부 클래스로 사용합니다. ColorAction 클래스를 분리하는 경우, ButtonPanel을 ColorAction에 전달해야 합니다. 구현은 다음과 같습니다.

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);
    }
}
로그인 후 복사
버튼을 구성하는 코드에 결함이 있습니다. 패널, 해당 색상의 리스너 구성 및 리스너 등록 모니터를 사용할 때 코드 중복을 피하기 위해 이러한 반복 작업을 포함하는 makeButton 메서드를 만들 수 있습니다.

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
로그인 후 복사
코드에서 리스너는 addActionListener()할 때 한 번만 호출됩니다. 따라서 리스너에 대한 별도의 클래스를 만들 필요가 없습니다. 대신 리스너를 사용할 때 새 ActionListener 인터페이스를 직접 생성하고 중괄호 안에 인터페이스 메서드를 구현하면 됩니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿