Maison  >  Article  >  Java  >  Explication de la programmation GUI en Java (Partie 2)

Explication de la programmation GUI en Java (Partie 2)

巴扎黑
巴扎黑original
2017-07-23 13:47:332319parcourir

1. Mécanisme de surveillance des événements

-- Source de l'événement : les composants de l'interface graphique dans le package awt ou swing, c'est-à-dire le composant où l'événement se produit

--Événement:Event Une opération effectuée par l'utilisateur sur le composant

-- Listener: Listener La méthode responsable du traitement de l'événement

2. Classes sous java.awt Package .event

WindowEvent //Événements de fenêtre, tels que l'utilisateur clique sur une fenêtre à moitié fermée, la fenêtre obtient ou perd le focus, maximise ou minimise, etc.

MouseEvent //Événements de la souris, souris enfoncée, souris relâchée, clic (Appuyez et relâchez) etc.

ActionEvent //Événement d'action, il ne représente pas une action spécifique, mais une sémantique, comme un bouton ou un menu étant cliqué en appuyant sur Entrée dans la zone de texte Etc., cela peut être compris de cette façon : une certaine action de l'utilisateur provoque l'exécution de la fonction de base d'un certain composant. Il s'agit de l'événement ActionEvent

Différents types d'événements correspondent. aux différentes interfaces d'écoute d'événements et aux noms des interfaces. Correspond au nom de l'événement.

WindowEvent - >WindowListener

MouseEvent ->MouseListener

ActionEvent ->ActionListener

Exemple de code :

import java.awt.Frame;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;public class Test20 {public static void main(String[] args) {
        Frame f = new Frame();
        f.setSize(400, 400);
        f.setVisible(true);

        f.addWindowListener(new WindowListener() {

            @Overridepublic void windowOpened(WindowEvent e) { // 窗口被打开// TODO Auto-generated method stub}

            @Overridepublic void windowClosing(WindowEvent e) { // 设置关闭事件// TODO Auto-generated method stubSystem.exit(0);
            }

            @Overridepublic void windowClosed(WindowEvent e) { // 用户已经关闭窗口// TODO Auto-generated method stub}

            @Overridepublic void windowIconified(WindowEvent e) { // 被最小化的时候// TODO Auto-generated method stub}

            @Overridepublic void windowDeiconified(WindowEvent e) { // 最小化被还原的时候// TODO Auto-generated method stub}

            @Overridepublic void windowActivated(WindowEvent e) { // 窗体被激活// TODO Auto-generated method stub}

            @Overridepublic void windowDeactivated(WindowEvent e) { // 失去焦点的时候// TODO Auto-generated method stub}

        });
    }
}

Avez-vous remarqué que lors de l'utilisation de l'interface WindowListener, de nombreux codes inhabituels seront introduits (ici, nous voulons juste le désactiver), et les méthodes dans l'excuse ne peuvent qu'être écrasées et ne peuvent pas être supprimées. , donc l'ensemble du projet semble très long. Afin de résoudre ce problème, il existe un adaptateur d'événement.

3. Adaptateur d'événement

JDK définit les classes d'implémentation correspondantes pour la plupart des classes d'interface d'écouteur d'événements (il contient de nombreuses méthodes d'implémentation vides pour nous faciliter la création d'un objet d'écoute de détection ), que nous appelons la classe d’adaptateur d’événements. Ici, j'ai utilisé WindowAdapter.

import java.awt.Frame;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class Test21 {public static void main(String[] args) {
        Frame f = new Frame("事件适配器的栗子");
        f.setSize(400, 400);
        f.setVisible(true);

        f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

Vous pouvez observer le code source de la classe WindowAdapter et en avoir une idée.

public abstract class WindowAdapterimplements WindowListener, WindowStateListener, WindowFocusListener
{/** * Invoked when a window has been opened.     */public void windowOpened(WindowEvent e) {}/** * Invoked when a window is in the process of being closed.
     * The close operation can be overridden at this point.     */public void windowClosing(WindowEvent e) {}/** * Invoked when a window has been closed.     */public void windowClosed(WindowEvent e) {}/** * Invoked when a window is iconified.     */public void windowIconified(WindowEvent e) {}/** * Invoked when a window is de-iconified.     */public void windowDeiconified(WindowEvent e) {}/** * Invoked when a window is activated.     */public void windowActivated(WindowEvent e) {}/** * Invoked when a window is de-activated.     */public void windowDeactivated(WindowEvent e) {}/** * Invoked when a window state is changed.
     * @since 1.4     */public void windowStateChanged(WindowEvent e) {}/** * Invoked when the Window is set to be the focused Window, which means
     * that the Window, or one of its subcomponents, will receive keyboard
     * events.
     *
     * @since 1.4     */public void windowGainedFocus(WindowEvent e) {}/** * Invoked when the Window is no longer the focused Window, which means
     * that keyboard events will no longer be delivered to the Window or any of
     * its subcomponents.
     *
     * @since 1.4     */public void windowLostFocus(WindowEvent e) {}
}

Pratiquons quelques exemples de gestionnaires d'événements.

Exemple 1 :

import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;//例一:在窗体中放置一个按纽,点击后让程序退出class TestFrame implements ActionListener { // ActionListener接口里面只有一个方法,下面会重写private Frame f;public TestFrame() {
        f = new Frame("窗口");
        init();
    }private void init() {
        f.setSize(300, 300);
        f.setLayout(new FlowLayout());// 布局模式Button b = new Button("退出程序");
        b.addActionListener(this);
        f.add(b);
        f.setVisible(true);

    }

    @Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubf.setVisible(false);
        f.dispose();// 在关闭的时候,可以用它来销毁窗体资源System.exit(0);// 退出    }

}public class Test22 {public static void main(String[] args) {new TestFrame();
    }

}

Ci-dessus, cliquez sur le bouton Quitter le programme pour quitter, cliquez sur le X en haut à droite coin, il n'est pas possible de sortir. Parce que WindowListener n'est pas défini.

Cet exemple utilise l'interface ActionListener. Vous pouvez consulter son code source, comme suit :

public interface ActionListener extends EventListener {/** * Invoked when an action occurs.     */public void actionPerformed(ActionEvent e);

}

Exemple 2 :

  TextField txtNo;=  Frame("请输入密码"f.setBounds(50, 50, 400, 400);f.setLayout( FlowLayout());=  TextField(10);  code = (!(code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) {System.out.println(KeyEvent.getKeyText(code) + "输入有误" 0

Classe de test :

public class Test23 {public static void main(String[] args) {new TestFrame();
    }
}

Exemple 3 :

Liste du contenu du répertoire spécifié :

import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.File;public class Test24 {public static void main(String[] args) {new MyWindow();
    }
}class MyWindow {
    MyWindow() {
        init();
    }private Frame f;private Button b;private TextField txtDir;// 用来输入目录名称private TextArea txtFileList;// 用来显示文件列表private void init() {
        f = new Frame("窗口");
        f.setBounds(44, 44, 500, 500);
        f.setLayout(new FlowLayout());

        txtDir = new TextField(8);
        b = new Button("显示");
        txtFileList = new TextArea(20, 30);// 用来显示文件列表的区域f.add(txtDir);
        f.add(b);
        f.add(txtFileList);
        initEvent();
        f.setVisible(true);
    }private void initEvent() {// TODO Auto-generated method stubf.addWindowListener(new WindowAdapter() {/** * Invoked when a window is in the process of being closed. The
             * close operation can be overridden at this point.             */public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        b.addActionListener(new ActionListener() {/** * Invoked when an action occurs.             */public void actionPerformed(ActionEvent e) {
                txtFileList.setText("");
                String dirStr = txtDir.getText();// 取出用户输入的路径File file = new File(dirStr);if (file.isDirectory() && file.exists()) {
                    String[] fileNameList = file.list();for (String s : fileNameList) {
                        txtFileList.append(s + "\r\n");// 别忘了换行符                    }
                } else {
                    txtFileList.append("输入有误,请重新输入");
                }
            }
        });

    }
}

Résultat : (je lui ai demandé d'afficher le répertoire de mon lecteur D)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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