死磕Java系列之GUI图形界面编程简介

GUI图形界面设计是用户和程序交互的工具,用户通过图形界面控制程序事件的发生。
首先介绍Swing的基本体系结构,这是底层的东西,swing的MVC设计模式,其次,讲述Swing中常用的窗体,窗体用来放按钮,标签。接下来介绍用户界面组件,如单选按钮,菜单栏等,最后讲述Java事件处理,事件处理即点击相关按钮以后所采取的行动。

(一)Swing简介

Swing由所有Java图形用户界面(GUI)组件所构成,可运行在任一支持Java虚拟机(JVM)的本地平台上。由于这些组件全都是用Java语言编写的,因此它们可以提供比本地平台GUI组件更多的功能。 Swing可以分为三个组:组件类(component class),容器类(container class),辅助类(helper class),组件类是创建用户界面的,例如,JButton,JLabel和JTextField。容器类是用来包含其他组件的, 容器类是用于盛装其他GUI组件的GUI组件,例如,Container,JFrame,JPanel和JApplet,JDialog。辅助类是用来支持GUI组件的,它们用来描述GUI组件的属性,例如,图形的内容,颜色,字体以及大小尺寸等。 例如,Graphics,Color,Font,FontMetrics和Dimension。
在这里插入图片描述

Swing中的组件根类:
在这里插入图片描述

(二)Swing 和MVC设计模式

设计模式是一种结构化的方法。Swing采用MVC设计模式(Model-View-Controller,既模型-视图-控制器),可以实现GUI组件的显示逻辑和数据逻辑的分离,允许程序员自定义Render来改变GUI组件的显示外观,提供更多的灵活性。**模型(Model)**用于维护组件的各种状态,存储内容;**视图(View)**是组件的可视化表现,显示内容;**控制器(Controller)**用于控制对于各种事件,处理用户输入;组件做出怎样的响应。当模型发送改变时,它会通知所有依赖它的视图,视图会根据模型数据更新自己,并存储在模型中,Swing使用UI代理来包装视图和控制器,还有另一个模型对象来维护该组件的状态,例如 , 按钮JButton有一个维护其状态信息的模型ButtonModel对象,Swing组件的模型是自动设置的,因此一般都使用JButton,而无须关系ButtonModel对象。采用MVC模式的优点在于一个模型可以有多个视图,且每个视图显示全部内容的不同部分或形式。
在这里插入图片描述

(三)Swing基本组成

用户界面的三个基本要素:内容(如按钮的状态或文本框的文本),外观(如颜色,字体,大小等),行为(对于事件的反应)。
(1)常用窗体

  • 窗体的概念类似于饭店的桌面,在窗体上可以设置按钮,标签,菜单栏,文本框等,同理,桌子上可以放盘子,牙签,装饰品等。窗口属于顶层容器,一个图形界面至少一个窗体,JFrame(框架)是一个容器。
    创建一个用户界面需要创建一个JFrame来存放用户界面组件.例如存放按钮,文本框。
    在这里插入图片描述

JDialog是对话框。
在这里插入图片描述

  • 中间容器充当基本组件的载体,不可独立显示。中间容器可以添加若干基本组件(也可以嵌套添加中间容器),对容器内的组件进行管理,类似于给各种复杂的组件进行分组管理。最顶层的一个中间容器必须依托在顶层容器(窗口)内,中间容器必须被添加到底层容器中才能发挥作用。
    中间容器类似于饭店盛饭菜的盘子,饭菜总不能直接倒在桌子上让客人吃,要放在盘子里,而中间容器的作用就是盘子。
    Jpanel面板 使用 JPanel 创建一个面板,再向这个面板添加组件,然后把这个面板添加到其他容器中。JPanel 面板的默认布局是 FlowLayout 布局。

    在这里插入图片描述

(2)界面布局
在饭店中,将饭菜放在桌子上,需要按照一定的方式来放,不能叠在一起,也不能放在桌子边上,同样的道理,在JFrame中加入按钮标签等,需要考虑布局管理,明确容器(Container)内的各个组件之间的排列布局方式。Swing中,每个组件在容器中都有一个具体的位置和大小,在容器中摆放各自组件时很难判断其具体位置和大小,这里我们就要引入布局管理器了,它提供了基本的布局功能,可以有效的处理整个窗体的布局。常用的布局管理器包括流布局管理器、边界布局管理器、网格布局管理器等,也可以设置布局为null,在通过setbounds(int x,int y)定义组建的确定位置。
在这里插入图片描述
流式布局:
在这里插入图片描述

边界布局:
在这里插入图片描述

网格布局:
在这里插入图片描述

(3)常用控件
基本组件是直接实现人机交互的组件,常用组件包括标签组件,按钮组件,列表组件,文本组件。

  • 文本框
    使用JComponent的子类JTextField创建文本框。文本框的允许用户输入单行文本。
  • 文本区
    使用JComponent的子类JButton类创建按钮,允许用户单击按钮。
  • 标签
    使用JComponent的子类JLabel类创建标签,标签为用户提供信息提示。
  • 选择框
    使用JComponent的子类JCheckBox类来创建选择框,为用户提供多项悬着。选择框提供两种状态,选中和未选中,用户通过单击该组件切换状态。
  • 单选按钮
    使用JComponent的子类的JRadioButton类创建单项选择框,为用户提供单项选择。
  • 下拉列表
    使用JComponent的子类的JComboBox类来创建下拉列表,为用户提供下拉列表。
  • 密码框
    使用JComponent的子类的子类JPasswordField创建密码框,允许输入单行密码,密码框默认回显字符是“*”,也可以通过setEchoChar(char c)来重新设置回显字符。密码框调用char[] getPassword()方法可以返回实际的密码。

在这里插入图片描述
常见复杂的组件有JTable,JTree;

常见组件 :
在这里插入图片描述

(4)Java事件处理
java事件监听器分为三部分:事件,事件源,监听器。
在这里插入图片描述

事件—事件状态对象,也就是发生了什么事件。用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中。
事件源—具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener(事件就是事件源中的一个状态)。这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承 java.util.EventListener
监听器—对每个明确的事件的发生,都相应地定义一个明确的Java方法

在这里插入图片描述
Java事件处理组件点击或者选择事件。组件菜单条, 按钮等都是对象,当我们单击对象时,应该能够完成一些任务.例如在程序中通过鼠标操作时,单击,双击,鼠标移入,鼠标移出.能够执行一些任务,在 Java中 使用事件监听机制,在Java的事件监听机制中 ,当事件发生时(点击按钮,移动鼠标等,关闭窗口)会被一类对象发现并处理.

执行顺序如下:
1、给事件源注册监听器
2、组件接受外部作用,也就是事件被触发
3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器
4、事件处理器启动,并执行相关的代码来处理该事件。

Java图形界面编程:GUI界面设计以饭桌上方的饭菜为例,在饭店吃饭,点菜,上菜,各种美食放在桌子上,这整个过程和GUI界面设计相关,当我们坐进饭店,招呼服务员来点菜时,就发生了事件监听的事件,服务员将我们点好的菜端上桌子,桌子就是JFrame,即窗体,饭菜不能直接倒在桌子上,然后用手抓着吃,我们要用盘子盛着饭菜,按照一定的顺序放在桌子上,盘子就是中间容器,这放盘子的顺组就是界面布局,桌子上的盘子不能胡乱摆,得按照一定的规则和方法,界面布局也有很多种类,那么饭菜就是组件,一个饭店可以做很多种饭菜,有凉菜热菜,那么组件自然有很多种。

  • 36
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
javaGUI图形界面 public class login extends JFrame { private JComboBox nameJComboBox; private JPanel userJPanel; private JLabel pictureJLabel; private JButton okJButton,cancelJButton; private JLabel nameJLabel,passwordJLabel,note; private JPasswordField passwordJPasswordField; private String name1; private String password1; private String user; private ImageIcon myImageIcon; public login( ) { createUserInterface(); // 调用创建用户界面方法 } private void createUserInterface() { Container contentPane = getContentPane(); contentPane.setLayout( null ); userJPanel = new JPanel(); userJPanel.setBounds( 35, 120, 300, 96 ); userJPanel.setBorder(BorderFactory.createEtchedBorder() ); //显示一圈边儿 userJPanel.setLayout( null ); contentPane.add( userJPanel ); nameJComboBox = new JComboBox(); nameJComboBox.setBounds( 100, 12, 170, 25 ); nameJComboBox.addItem( "admin" ); nameJComboBox.addItem( "aloie" ); nameJComboBox.setSelectedIndex( 0 ); nameJComboBox.setEditable(true); userJPanel.add( nameJComboBox ); pictureJLabel=new JLabel(); pictureJLabel.setBounds(45,0,380,118); pictureJLabel.setIcon(new ImageIcon("pic.gif")); contentPane.add(pictureJLabel); nameJLabel=new JLabel("姓 名:"); nameJLabel.setBounds(20,12,80,25); userJPanel.add(nameJLabel); passwordJPasswordField=new JPasswordField(); passwordJPasswordField.setBounds(100,60,170,25); userJPanel.add(passwordJPasswordField); passwordJLabel=new JLabel("密 码:"); passwordJLabel.setBounds(20,60,80,25); userJPanel.add(passwordJLabel); note=new JLabel("密码与用户名相同"); note.setBounds(0,295,180,25); add(note); okJButton=new JButton("登 陆"); okJButton.setBounds(60,250,80,25); contentPane.add(okJButton); okJButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent event) { okJButtonActionPerformed(event); } } ); cancelJButton=new JButton("取 消"); cancelJButton.setBounds(210,250,80,25); contentPane.add(cancelJButton); cancelJButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent event ) { System.exit(0); //退出登陆 } } ); setTitle( "登陆窗口" ); setSize( 380, 350 ); setResizable( false ); //将最大化按钮设置为不可用 } private void okJButtonActionPerformed( ActionEvent event ) { //okJButton响应事件,检查用户名和密码的匹配 name1= nameJComboBox.getSelectedItem().toString(); if (name1.equals("admin") ) { if (passwordJPasswordField.getText().equals("admin")) { showNewWindow(); setVisible( false); } else { JOptionPane.showMessageDialog( this,"密码错误,拒绝登陆", "密码错误 !", JOptionPane.ERROR_MESSAGE ); } } else if (name1.equals("aloie")) { if ( passwordJPasswordField.getText().equals("aloie") ) { showNewWindow(); setVisible(false); } else { JOptionPane.showMessageDialog( this,"密码错误,拒绝登陆", "密码错误 !", JOptionPane.ERROR_MESSAGE ); } } } public void showNewWindow() { JFrame jf=new JFrame("main Frame"); jf.setSize(500,400); jf.setVisible(true); jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } public static void main( String[] args ) { JFrame.setDefaultLookAndFeelDecorated(true); login mylogin = new login( ); mylogin.setVisible( true ); mylogin.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值