死磕Java系列之GUI 组件和事件监听

当我们搭建好图形界面窗体的时候,需要向窗体中加入各种组件,便于用户操作,用户在窗体中都会有哪些操作呢?窗体是程序与使用者可交互的接口,比如说登录界面,用户可以输入姓名和密码,点击登录按钮,登录到另一个界面,在下一个界面有更多的操作,比如说有多个选择组成的菜单,需要输入文本的文本框,用来标记的标签等。综上,一个窗体中有多个组件,组件有文本组件,按钮组件,标签组件和列表组件。当然了,一个窗体中有组件是不够的,还需要在窗体中加入监听事件,监听事件也就是说当用户点击相应的组件的时候,程序作出的响应反应,比如说登录界面点击登录按钮以后,监听器事件就是检测密码是否正确,然后选择跳入到另一个界面,这样的话,如何在窗体中加入组件呢?监听器事件有哪些类型,如何定义呢?

(一)组件

在窗体中加入各种组件便于用户操作,组件有文本组件,按钮组件,标签组件和列表组件。
在这里插入图片描述
具体的组件设计方式可见Java Swing 图形界面开发(目录)

1. 文本组件

  1. JTextField 是一个轻量级组件,它允许编辑单行文本。
    JavaSwing_2.6: JTextField(文本框)
    在这里插入图片描述在这里插入图片描述

  2. JPasswordField 是一个轻量级组件,允许编辑单行文本,其视图指示键入内容,但不显示原始字符,显示为密码框。
    JavaSwing_2.7: JPasswordField(密码框)
    在这里插入图片描述

  3. JTextArea 是一个显示纯文本的多行区域。
    JavaSwing_2.8: JTextArea(文本区域)
    在这里插入图片描述
    示例代码:

package VideoTest;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class TEST02 extends JFrame
{
   public TEST02()
   {
      super("SwingDemo");//定义名称
      JPanel root = new JPanel();//实例化容器
      root.add(new JTextField("我是JTextField"));//加入文本框
      root.add(new JPasswordField("我是JPasswordField"));//加入密码框
      root.add(new JTextArea("我是JTextArea"));//加入文本域
      add(root);
      //定义窗体相关参数
      setSize(400, 300);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setVisible(true);
   }

   public static void main(String[] args)
   {
      new TEST02();
   }
}

运行结果:
在这里插入图片描述

2. 按钮组件

-单选按钮(JRadioButton), 实现一个单选按钮,此按钮项可被选择或取消选择,并可为用户显示其状态。与 ButtonGroup 对象配合使用可创建一组按钮,一次只能选择其中的一个按钮。
JavaSwing_2.3: JRadioButton(单选按钮)在这里插入图片描述

3. 标签组件

  • 标签 ,使用JComponent的子类JLabel类创建标签,标签为用户提供信息提示。
    JavaSwing_2.1: JLabel(标签)
    4. 列表组件
    窗口中的菜单条、菜单、菜单项是我们所熟悉的组件,菜单放在菜单条里,菜单项放在菜单中菜单条 。菜单条,菜单,菜单项的关系是:菜单项是菜单的具体名称,菜单加入到菜单条中,菜单条加入容器中,菜单条是将菜单放入窗体的方法,具体而言,饭店的菜单上,菜单条就是大饭店的菜单本,菜单就是饭店菜单的菜单页, 菜单项就是具体的某一个菜的名称。
  • JMenubar 是一个菜单条,JFrame类用一个把菜单条放到窗口的方法:

setJMenuBar( JMenuBar bar);
该方法将菜单条添加到窗口的顶端,需要注意的是,只能向窗口添加一个菜单条。
JavaSwing_4.5: JMenuBar(菜单栏)

  • 菜单 JMenu负责创建菜单。
  • 菜单项 JMenuItem负责创建菜单项

JMenuItem(String text, Icon icon)

package VideoTest;

import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;

/**
 * 菜单条,菜单,菜单项的关系是:菜单项是菜单的具体名称,菜单加入到菜单条中,菜单条加入容器中,
 * 菜单条是将菜单放入窗体的方法,具体而言,饭店的菜单上,菜单条就是大饭店的菜单本,菜单就是饭店菜单的菜单页
 * 菜单项就是具体的某一个菜的名称。
 */
public class TEST02 extends JFrame {
    JMenuBar menubar;//实例化 菜单条
    JMenu menu, subMenu;//实例化菜单
    JMenuItem item1, item2;//实例化菜单项
    public static void main(String[] args) {
        TEST02 win = new TEST02("带窗口的菜单", 20, 30, 400, 500);
    }
    public TEST02() {
    }
    //定义方法设置窗体的参数,输入窗体的大小,名称,和位置
    public TEST02(String s, int x, int y, int w, int h) {
        init(s);
        setLocation(x, y);
        setSize(w, h);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
   
    void init(String s) {
        setTitle(s);
        menubar = new JMenuBar();
        menu = new JMenu("菜单"); // JMnud的实例就是一个菜单
        /**
         * 一级菜单项
         */
        subMenu = new JMenu("软件项目"); // 子菜单
        item1 = new JMenuItem("Java话题"); // 创建菜单项
       
        //使用JMenuItem的构造方法设置图标
        item2 = new JMenuItem("动画话题" );
        item1.setAccelerator(KeyStroke.getKeyStroke('A'));
        item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
       
        //菜单项加入菜单中。
        menu.add(item1);
        menu.addSeparator();
        menu.add(item2);
        menu.add(subMenu);
        /**
         * 添加二级菜单项
         */
        subMenu.add(new JMenuItem("汽车销售系统" ));
        subMenu.add(new JMenuItem("农场信息系统" ));
        menubar.add(menu); // 菜单条中加入菜单
        setJMenuBar(menubar); // 添加一个菜单条

    }
}
 

运行结果:
在这里插入图片描述

常见组件组合的实例:


import java.awt.FlowLayout;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/*
 * 这个里最包含了JavaGUI中的多个组件,
 */
public class TEST02 extends JFrame {

    JTextField text;//实例化文本
    JButton button;//实例化按钮
    JCheckBox checkBox1, checkBox2, checkBox3;
    JRadioButton radio1, radio2;//实例化单选按钮
    ButtonGroup group;//实例化按钮组件
    JComboBox<Object> comBox;
    JTextArea area;//定义文本域
    JPasswordField password;//定义密码框
    public static void main(String[] args) {
    	TEST02 win = new   TEST02();
        win.setBounds(100, 100, 520, 510);
        win.setTitle("常用组件");
    }
 
    public TEST02() {
        init();
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    void init() {
        setLayout(new FlowLayout()); // 设置布局
        
        //定义文本框及其相关参数
        add(new JLabel("文本框:"));
        text = new JTextField(10);
        add(text);
     
        //定义按钮及其相关参数
        add(new JLabel("按钮:"));
        button = new JButton("确认");
        add(button);
     
        //定义密码框及其相关参数
        add(new JLabel("密码框:"));
        password = new JPasswordField(10);
        add(password);
   
        //定义按钮标签及其相关参数
        add(new JLabel("按钮:"));
        button = new JButton("确认");
        add(button);
     
        //定义 选择框及其相关参数
        add(new JLabel("选择框:"));
        checkBox1 = new JCheckBox("喜欢音乐");
        checkBox2 = new JCheckBox("喜欢旅游");
        checkBox3 = new JCheckBox("喜欢篮球");
        add(checkBox1);
        add(checkBox2);
        add(checkBox3);

      //定义单选按钮及其相关参数
        add(new JLabel("单选按钮:"));
        group = new ButtonGroup();
        radio1 = new JRadioButton("男");
        radio2 = new JRadioButton("女");
        group.add(radio1);
        group.add(radio2);
        add(radio1);
        add(radio2);

      //定义 下拉列表及其相关参数
        add(new JLabel("下拉列表:"));
        comBox = new JComboBox<>();
        comBox.addItem("音乐天地");
        comBox.addItem("武术天地");
        comBox.addItem("象棋乐园");
        add(comBox);

      //定义文本区及其相关参数
        add(new JLabel("文本区"));
        area = new JTextArea(6, 13);// 文本区设置行数和列数
        add(new JScrollPane(area));
    }
}

运行结果:
在这里插入图片描述
在组件的设计中,树和表格是比较少用的,

(二)监听器事件

任何支持GUI的操作环境都需要不断地监听按键或者点击鼠标这样的事件,操作环境将这些事件报告给正在运行的程序,如果事件发生,每个程序将决定如何对他们做出反应,当事件发生时,事件源将事件对象传递给注册的监听器对象,监听器对象将利用事件的信息决定如何对事件做出反应。
Java监听器事件主要有事件源,事件监听器和事件组成。
1.事件对象
一般继承自java.util.EventObject对象,由开发者自行定义.
2.事件源
就是触发事件的源头,注册监听器对象,并发送事件对象,不同的事件源会触发不同的事件类型.
3.事件监听器
事件监听器负责监听事件源发出的事件.一个事件监听器通常实现java.util.EventListener这个标识接口.
在这里插入图片描述

监听器事件的处理流程: 事件源可以注册事件监听器对象,并可以向事件监听器对象发送事件对象.事件发生后,事件源将事件对象发给已经注册的所有事件监听器.
监听器对象随后会根据事件对象内的相应方法响应这个事件.换句话来说,事件监听器监听到事件源的发生以后,执行事件的行为。

在这里插入图片描述
常见的监听器类型有:
常见的监听器类型
基于鼠标的监听器事件:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
 *  这段程序的作用在于在窗体中加入三个按钮,点击不同的按钮,窗体的颜色会发生变化。
 */
public class Test01 extends JFrame{
   private JPanel buttonPanel;
   private static final int DEFAULT_WIDTH = 300;
   private static final int DEFAULT_HEIGHT = 200;
   public static void main(String[] args)
      {
      EventQueue.invokeLater(new Runnable()
         {
            public void run()
            {
            	//定义窗体
             Test01 frame = new Test01();
               frame.setTitle("ButtonTest");
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               frame.setVisible(true);
            }
         });
   }
   public Test01()
   {      
     setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
      // create buttons
      JButton yellowButton = new JButton("Yellow");
      JButton blueButton = new JButton("Blue");
      JButton redButton = new JButton("Red");     
      buttonPanel = new JPanel();
      // add buttons to panel
      buttonPanel.add(yellowButton);
      buttonPanel.add(blueButton);
      buttonPanel.add(redButton);
       // add panel to frame
      add(buttonPanel);

      // create button actions
      ColorAction yellowAction = new ColorAction(Color.YELLOW);
      ColorAction blueAction = new ColorAction(Color.BLUE);
      ColorAction redAction = new ColorAction(Color.RED);

      // associate actions with buttons
      yellowButton.addActionListener(yellowAction);
      blueButton.addActionListener(blueAction);
      redButton.addActionListener(redAction);    
   }
   /**
    * An action listener that sets the panel's background color.
    */
   private class ColorAction implements ActionListener
   {
      private Color backgroundColor;
      public ColorAction(Color c)
      {
         backgroundColor = c;
      }
      public void actionPerformed(ActionEvent event)
      {        
    	  buttonPanel.setBackground(backgroundColor);
      }
   }
}
 

运行结果:
在这里插入图片描述

基于鼠标的监听器事件:

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener; 
import javax.swing.*;
/*
*这个程序定义一个窗体,然后窗体监听鼠标事件,当鼠标出现在窗体中时,通过监听鼠标事件
*点击窗体,则显示鼠标所在的位置,以及点击次数等
**/
public class Test01 extends JFrame{
	My_Panel mp = null;
	public Test01() {
		 
		mp = new My_Panel();
		this.add(mp);
		// 注册监听
		this.addMouseListener(mp); // 监听鼠标
		this.addKeyListener(mp); // 监听键盘
		this.addMouseMotionListener(mp); // 监听鼠标移动
		//定义窗体的相关参数
		this.setSize(300, 300); // 设置框体大小
		this.setLocation(400,150); //设置框体显示的位置
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置框体退出
		this.setVisible(true); // 显示框体
	}
	public static void main(String[] args) {
	 
		Test01 d = new Test01();
	}
 
}
 
class My_Panel extends JPanel implements MouseListener,KeyListener,MouseMotionListener{
	public void paint(Graphics g){
		super.paint(g);
	}
	//鼠标点击
	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		System.out.println("鼠标点击");
		System.out.println("鼠标位置 x = "+e.getX()+" y = "+e.getY());
		System.out.println("鼠标键 = "+e.getButton() + " 点击次数 "+e.getClickCount()); // 输出1是左键,2是中键,3是右键
	}



	//鼠标移动到My_Panel
	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
	//	System.out.println("鼠标移动到My_Panel");
	}
	//鼠标离开My_Panel
	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
	//	System.out.println("鼠标离开My_Panel");
	}
	//鼠标按下
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
	//	System.out.println("鼠标按下");
	}
	//鼠标松开
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
	//	System.out.println("鼠标松开");
	}
	//键按下
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		System.out.println("键  = "+e.getKeyChar());
		
	}
	//键松开
	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	//键输入
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	//鼠标按键在组件上按下并拖动时调用
	@Override
	public void mouseDragged(MouseEvent e) {
		// TODO Auto-generated method stub
	//	System.out.println("鼠标按键在组件上按下并拖动时调用");
	}
	//鼠标光标移动到组件上但无按键按下时调用
	@Override
	public void mouseMoved(MouseEvent e) {
		// TODO Auto-generated method stub
	//	System.out.println("鼠标光标移动到组件上但无按键按下时调用");
	}
}

运行效果如图:

在这里插入图片描述

以上

JAVA图形界面设计部分完成了,整个模块包括常用窗体,布局方式,常用组件和监听事件这四个部分,图形界面设计和在饭店点菜的逻辑类似,进入大饭店点菜就是监听器事件,出事做好饭后端上来放在桌子上,桌子就是窗体,当然了,饭菜不能说直接放在桌子上要盘子盛着,盘子就是中层容器面板,桌子上有很多的菜,也有很多其他的小东西,如牙签,筷子,餐巾纸等,那么,这些东西就和图形界面设计中的组件一样,在窗体中有一些作用,那么用吃饭来形容监听器事件或许更加形象一点,综上,图形界面设计是Java设计程序时和用户交互的工具,设计窗体并加入组件,当使用者采取下一步行动以后,监听器事件发生作用,监听事件的发生,并决定如何行动。

猜你喜欢

转载自blog.csdn.net/weixin_41792162/article/details/85201464