参考链接: https://blog.csdn.net/qq_42035966/article/details/82258199#5.插件介绍WindowBuilder
早期,电脑向用户提供的是单调、枯燥、纯字符状态的“命令行界面(CLI)”。就是到现在,我们还可以依稀看到它们的身影:在Windows中开个DOS窗口,就可看到历史的足迹。后来,Apple公司率先在电脑的操作系统中实现了图形化的用户界面(Graphical User Interface,简称GUI),但由于Apple公司封闭的市场策略,自己完成电脑硬件、操作系统、应用软件一条龙的产品,与其它PC不兼容。这使得Apple公司错过了一次一统全球PC的好机会。
后来,Microsoft公司推出了风靡全球的Windows操作系统,它凭借着优秀的图形化用户界面,一举奠定了操作系统标准的地位。这也造就了世界首富---比尔.盖茨和IT业的泰山北斗微软公司。
在这图形用户界面风行于世的今天,一个应用软件没有良好的GUI是无法让用户接受的。而Java语言也深知这一点的重要性,它提供了一套可以轻松构建GUI的工具。在本章和下一章中,我们将向你充分证明这一点。
java.awt 包 – 主要提供字体/布局管理器
javax.swing 包[商业开发常用] – 主要提供各种组件(窗口/按钮/文本框)
java.awt.event 包 – 事件处理,后台功能的实现。
如图所示:swing组件主要可分为三个部分,后面会详细介绍
(1)顶层容器::常用有JFrame,JDialog
(2)中间容器:JPanel,JOptionPane,JScrollPane,JLayeredPane 等,主要以panel结尾。
(3)基本组件:JLabel,JButton,JTextField,JPasswordField,JRadioButton 等。
顶层容器
JFrame组件在javax.swing.JFrame
中间容器
基本组件
JFrame常用方法:
代码演示:
//创建一个窗口
import javax.swing.JFrame;
public class JFrameDemo extends JFrame{
public static void main(String[] args) {
//创建JFrame对象
JFrame jFrame1 = new JFrame("第一个JFrame窗口");
//设置窗口的大小
jFrame1.setSize(720,680);
//设置窗口显示位置
jFrame1.setLocation(500,200);
//设置窗口大小可调整
jFrame1.setResizable(true);
//设置窗口拓展延水平方向最大化
jFrame1.setExtendedState(MAXIMIZED_HORIZ);
//设置关闭窗口的操作为什么都不做
jFrame1.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
//设置窗口可视化,一般放在最后一步
jFrame1.setVisible(true);
}
}
结果:
JPanel常用方法:
代码演示:
//JPanel组件的使用
import javax.swing.JFrame;
import java.awt.*;
import javax.swing.JPanel;
public class JPanelDemo extends JFrame {
public JPanelDemo() {
this.init();
}
public static void main(String[] args) {
JPanelDemo frameDemo = new JPanelDemo();
}
private void init() {
// 获取当前的内容面板
Container container = this.getContentPane();
// 设置布局为空布局
setLayout(null);
// 创建JPanel组件面板
JPanel jPanel = new JPanel();
// 设置JPanel组件面板大下小
jPanel.setSize(540, 420);
jPanel.setBackground(new Color(86,182,255));
jPanel.setLocation(0, 0);
container.add(jPanel);
// 设置窗口可视化,一般放在最后一步
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("登录界面");
this.setSize(540, 420);
this.setVisible(true);
}
}
结果:
Container类通常用于操作JFrame的内容面板
常用方法:
JButton常用方法:
JLabel常用方法:
JTextField的常用方法 :
public void setEditable(boolean b)设置文本框是否可以编辑
public void setEnabled(boolean enabled)设置文本框的启用或禁用
public void setVisible(boolean b)设置文本框是否可见
public int getColumns()获取文本域的宽度
public void setColumns(int columns)设置文本域的宽度
public void setEchoChar(char c)设置文本域的回显字符为c,比如输入密码的输入框,设置回显字符为*
public void addActionListener(ActionListener al) 添加对文本框的监听器,由按Enter键触发
JTextArea的常用方法:
几种常见的布局:
流式布局(FlowLayout)是最基本的一种布局,容器缺省的布局就是流式布局。
流式布局是值把图形元素一个接一个的放在容器中,按照组件加入的先后顺序从左到右排列,当一行排列满后就转到下一行继续从左到右排列。
构造方法:
静态属性:
常用方法:
代码演示:
package com.company.project.sample.s1;
import java.awt.Button;
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class FlowLayoutDemo extends JFrame {
Button bt1 = new Button("A");
Button bt2 = new Button("B");
Button bt3 = new Button("C");
Button bt4 = new Button("D");
Button bt5 = new Button("E");
Button bt6 = new Button("F");
public void init() {
//初始化流式布局(向左对齐,水平间距为20,垂直间距为30)
FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT, 20, 30);
//设置布局为流式布局
setLayout(flowLayout);
add(bt1);
add(bt2);
add(bt3);
add(bt4);
add(bt4);
add(bt5);
add(bt6);
this.setSize(200, 200);
this.setVisible(true);
}
public static void main(String[] args) {
FlowLayoutDemo flowLayoutDemo = new FlowLayoutDemo();
flowLayoutDemo.init();
}
}
结果:
边界布局(BorderLayout)将窗口区域分为东、南、西、北和中央五个区域,在窗口边缘是四个狭窄的、固定宽度的区域,中间为一个大的区域。
构造方法:
静态属性:
成员方法:
代码演示:
package com.company.project.sample.s1;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Label;
import javax.swing.JFrame;
public class BorderLayoutDemo extends JFrame {
Button bt1 = new Button("北");
Button bt2 = new Button("西");
Button bt3 = new Button("东");
Button bt4 = new Button("南");
Label label = new Label("中");
public void init() {
// 初始化边界布局
BorderLayout borderLayout = new BorderLayout(10, 10);
// 设置布局为边界布局
setLayout(borderLayout);
add(bt1, BorderLayout.NORTH);
add(bt2, BorderLayout.WEST);
add(bt3, BorderLayout.EAST);
add(bt4, borderLayout.SOUTH);
add("Center", label);
this.setSize(200, 200);
this.setVisible(true);
}
public static void main(String[] args) {
BorderLayoutDemo borderLayoutDemo = new BorderLayoutDemo();
borderLayoutDemo.init();
}
}
结果:
GridLayout类是一个布局管理器,它将一个容器的组件放在矩形网格中。 容器被分成等大小的矩形,并且每个矩形中放置一个组件。
构造方法:
成员方法:
代码演示:
package com.company.project.sample.s1;
import java.awt.*;
import java.applet.Applet;
public class GridLayoutDemo extends Applet {
public void init() {
setLayout(new GridLayout(3, 2));
add(new Button("1"));
add(new Button("2"));
add(new Button("3"));
add(new Button("4"));
add(new Button("5"));
add(new Button("6"));
}
}
结果:
在设计用户界面时,为了更加合理的安排各组件在窗口的位置,可以考虑将所需组件先安排在一个容器中,然后再将其作为一个整体加入另一个容器。
Panel类是这样一个被称为面板的容器类,它是一种无边框的,不能移动、放大、缩小或关闭的容器。
Panel对象不能作为最底层的容器,也不能指定大小。
Panel总是作为一个容器组件被加入到Applet或Frame等其他容器,也可以加入到其他的Panel容器中,形成复杂的图形界面系统。
首先创建Panel的对象,然后设置对象的布局 格式,即设置Panel容器的布局,设置方法在与Applet容器中的设置一样,只是需要使用Panel对象的setLayout()方法,并使用Panel对象的add()方法往Panel容器加入组件。
5.4 代码案例
package com.company.project.sample.s1;
import java.applet.Applet;
import java.awt.*;
public class AppletPanelCalc extends Applet {
public void init() {
setLayout(new BorderLayout());
add("North", new Button("按钮北"));
add("West", new Button("按钮西"));
add("South", new Button("按钮南"));
add("East", new Button("按钮东"));
Panel panel = new Panel();
panel.setLayout(new GridLayout(3, 3));
for (int i = 1; i < 10; i++) {
panel.add(new Button((new Integer(i)).toString()));
}
add("Center", panel);
}
}
结果:
还有一些Swing基本组件,这里就不一一列举了!!!
监听器,字面上的理解就是监听观察某个事件(程序)的发生情况,当被监听的事件真的发生了的时候,事件发生者(事件源) 就会给注册该事件的监听者(监听器)发送消息,告诉监听者某些信息,同时监听者也可以获得一份事件对象,根据这个对象可以获得相关属性和执行相关操作。
监听器模型涉及以下三个对象:
(1)事件:用户对组件的一个操作,或者说程序执行某个方法,称之为一个事件,如机器人程序执行工作。 (2)事件源:发生事件的组件就是事件源,也就是被监听的对象,如机器人可以工作,可以跳舞,那么就可以把机器人看做是一个事件源。 (3)事件监听器(处理器):监听并负责处理事件的方法,如监听机器人工作情况,在机器人工作前后做出相应的动作,或者获取机器人的状态信息。
执行顺序如下:
1、给事件源注册监听器。 2、组件接受外部作用,也就是事件被触发。 3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器。 4、事件处理器启动,并执行相关的代码来处理该事件。
监听器模式:事件源注册监听器之后,当事件源触发事件,监听器就可以回调事件对象的方法;更形象地说,监听者模式是基于:注册-回调的事件/消息通知处理模式,就是被监控者将消息通知给所有监控者。
1、注册监听器:事件源.setListener。 2、回调:事件源实现onListener。
代码案例:
package com.company.project.sample.s1;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class Calc extends Applet implements ActionListener {
JTextField jTextField;
Button[] buttons = new Button[9];
public void init() {
setLayout(new BorderLayout());
jTextField = new JTextField();
add("North", jTextField);
Panel panel = new Panel();
panel.setLayout(new GridLayout(3, 3));
for (int i = 0; i < 9; i++) {
buttons[i] = new Button((new Integer(i + 1)).toString());
buttons[i].addActionListener(this);
panel.add(buttons[i]);
}
add("Center", panel);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
for (int i = 0; i < 9; i++) {
if (e.getSource() == buttons[i]) {
jTextField.setText(jTextField.getText() + (i + 1));
}
}
}
}
结果: