第14篇-JAVA GUI编程

2022-03-11 11:29 更新
  • 每篇一句 :道路一开始开辟的时候总是存在障碍的
  • 初学心得: 原本下定决心才能开始的事情也变得理所当然
  • (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-25| JAVA GUI编程 ]

1.什么是界面

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面
与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受

2.Java 基础类 JFC 的基本概念

主要包含5 个 API: AWT, JavaD, Accessibility,Drag & Drop,Swing
它提供了帮助开发人员设计复杂应用程序的一整套应用程序开发包

3.什么是组件(Component)

组件构成图形界面零部件面板按钮下拉选等等,具有图形界面,并能完成一定功能的封装体

4.什么是容器(Container)

用于包含其它组件的组件

5.什么是Swing

  • Swing 是 Java 平台的 UI —— 它充当处理用户和计算机之间全部交互的软件
    它实际上充当用户和计算机内部之间的中间人
    - Swing组件是Java语言提供的第二代GUI设计工具包
    它以AWT为基础在AWT内容的基础上新增或改进了一些GUI组件使得GUI程序功能更强大设计更容易、更方便

    Swing 组件主要为文本处理、按钮、标签、列表、pane、组合框、滚动条、滚动 pane、菜单、表格和树提供了组件
    - JButton 能显示文本和图形的按钮,它是AWT按钮组件的替代组件
    - JCheckBox 能显示文本和图形的复选框,它是AWT选择组件的替代组件
    - JCheckBoxMenuItem 一个复选框菜单项,它是AWT的复选框菜单项组件的替代组件
    - JComboBox 带下拉列表的文本框,它是AWT选择组件的替代组件
    - JComponent 所有轻量J组件的基类
    - JDesktopPane 内部窗体的容器
    - JDialog Swing对话框的基类,它扩展了AWT Dialot类
    - JEditorPane 用于编辑文本的文本窗格
    - JFrame 扩展java.awt.Frame的外部窗体
    - JInternalFrame 在JDesktopPane中出现的内部窗体
    - JLabel 可显示文本和图标的标签,它是AWT标签组件的替代组件
    - JLayeredPane 能够在不同层上显示组件的容器
    - JList 显示选项列表的组件,它是AWT列表组件的替代组件
    - JMenu 菜单条中显示的一个菜单,它是AWT菜单组件的替代组件
    - JMenuBar 用于显示菜单的菜单条,它是AWT菜单条组件的替代组件
    - JMenuItem 菜单项,它是AWT菜单项组件的替代组件
    - JOptionPane 显示标准的对话框,如:消息和问题对话框
    - JPanel 通用容器,它是AWT面板和画布组件的替代组件
    - JPasswordfield JTextField的扩展,使输入的字符不可见
    - JPopupMenu 弹出式菜单,它是AWT弹出式菜单组件的替代组件
    - JProgressBar 进度指示器
    - JRadioButton 单选按钮,它是AWT复选框组件的替代组件
    - JRootPane 顶层容器,它包含一个玻璃窗格,一个层窗格,一个内容窗格和一个可选的菜单条
    - JScrollBar 滚动条,它是AWT滚动条组件的替代组件
    - JScrollPane 滚动窗格,它是AWT滚动窗格组件的替代组件
    - JSeparator 水平或垂直分隔条
    - JSlider 滑杆
    - JSplitPane 有两个分隔区的容器,这两个分隔区可以水平排列或者垂直排列且分隔区的大小能自动调整
    - JTabbedPane 带选项卡的窗格
    - JTable 表格
    - JTableHeader 表格头
    - JTextArea 用于输入多行文本的文本域,它是AWT文本域组件的替代组件
    - JTestComponent 文本组件的基类,它替代AWT的TextComponent类
    - JTextField 单行文本域,它替代AWT的单行文本域组件
    - JTextPane 简单的文本编辑器
    - JToggleButton 两种状态的按钮,它是JCheckBox和JRadioButton组件的基类
    - JToolBar 工具条
    - JToolTip 当光标停留在一个组件上时,该组件上显示的一行文字
    - JTree 用于按钮层次组织数据的结构控件
    - JViesport 用于浏览可滚动组件的视口
    - JWindow 外部窗口,它是java.awt.Window的扩展

6.什么是AWT

AWT: AWT 是抽象窗口工具集(Abstract Window Toolkit)的英文缩写,为用户界面程序提供所需要的组件
- 例如按钮、标签、复选框、下拉菜单、画布、文本输入区、列表等
- 此外,AWT还提供事件类、监听器类、图形处理工具、2D 图形等的支持
- AWT 存在缺少剪贴板、打印支持等缺陷,甚至没有弹出式菜单和滚动窗口

java.awt包,在这个包中,提供了基本的java程序GUI设计工具:
- Component/MenuComponent
- Container
- LayoutMa

Swing: 不是真正使用原生平台提供设备,而是仅仅在模仿,因此可以在任何平台上使用Swing 图形用户界面组件
- Swing 绝大部分组件都是轻量级组件,它不像重量级组件那样必须在它们自己本地窗口中绘制,而是在它们所在的重量级窗口中绘制,它比AWT适应性更强

Container(容器)
- 容器(Container)实际上是Component的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其它组件和容器的功能。
- 容器类对象可使用方法add()添加组件
两种主要的容器类型
- Window:可独立存在的顶级窗口
- Panel:可作为容器容纳其它组件,但不能独立存在,必须被添加到其它容器中(如Window 或 Applet)

Container常用方法:
- add()
- setLocation():设置位置
- setSize():设置大小
- setBoundes():同时设置大小、位置
- setVisible()
- pack()


Frame类:
- 代表一个窗口,是Window类的子类
- 有标题,可通过拖拉改变大小
- 初始化时为不可见,可用setVisible(true)使其显示出来
- 使用BorderLayout作为其缺省布局管理器
- 使用setLayout方法改变布局管理器

Container的布局管理器
- AWT中的布局管理器有:
- FlowLayout
- BorderLayout
- GridLayout
- CardLayout
- GridBagLayout

基本组件
- Button:按钮,可接收单击操作
- Canvas:用于绘图的画布
- Checkbox:复选框组件(也可变成单选框组件)
- CheckboxGroup:用于将多个Checkbox组件组合成一组,一组Checkbox组件将只有一个可以被选中,即全部变成单选框组件
- Choice:下拉式选择框组件
- Frame:窗口,在GUI程序里通过该类创建窗口
- Label:标签类,用于放置提示性文本
- List。列表框组件,可以添加多项条目
- Panel:不能单独存在基本容器类,必须放到其他容器中
- Scrollbar:滑动条组件。如果需要用户输入位于某个范围的值,就可以使用滑动条组件。如调色板中设置RGB的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向、初始值、滑块的大小、最小值和最大值
- ScrollPane:带水平及垂直滚动条的容器组件
- TextArea:多行文本域
- TextField:单行文本框

AWT的事件处理方式
- 委派式事件处理(delegation)----个别的组件将整个事件处理委托给特定的对象,当该组件发生指定的事件时,就通知所委托的对象,有这个对象来处理这个事件,这个受委托处理事件的对象称为事件倾听对象(event listener)
- 每个组件均可以针对特定的事件指定一个或多个事件倾听对象,由这些事件倾听对象负责处理事件

创建菜单 :创建一个菜单步骤:
- 创建一个MenuBar对象,将其放置到菜单容器中(如Frame)
- 创建若干个Menu对象,将其放置到MenuBar对象中
- 创建若干个MenuItem对象,将其放置到Menu对象中

MenuItem包括
- MenuItem:普通的菜单项
- CheckboxMenuItem:可以选择的菜单项

右键菜单 :右键菜单使用PopupMenu对象表示,创建右键菜单的步骤如下:
- (1)创建PopupMenu的实例
- (2)创建多个MenuItem实例,依次将这些实例加入PopupMenu中
- (3)将PopupMenu加入到目标组件之中
- (4)为需要出现上下文菜单的组件编写鼠标监听器,当用户释放鼠标右键时弹出右键菜单


AWT中画图:创建Canvas类或Panel的子类,并覆盖paint方法
- 每当组件出现时调用paint方法
- 每个组件都有一个Graphics对象
- Graphics类实现了很多绘图方法


Graphics类:Graphics是一个抽象的画笔对象,Graphics可以在组件上绘制丰富多彩的几何图形和位图,Graphics类提供了如下几个方法用于绘制几何图形和位图
- drawLine:绘制直线
- drawString:绘制字符串
- drawRect:绘制矩形
- drawRoundRect:绘制圆角矩形
- drawOval:绘制椭圆形状
- drawPolygon:绘制多边形边框
- drawArc:绘制一段圆弧(可能是椭圆的圆弧)
- drawPolyline:绘制折线
- fillRect:填充一个矩形区域
- fillRoundRect:填充一个圆角矩形区域
- fillOval:填充椭圆区域
- fillPolygon:填充一个多边形区域
- fillArc:填充圆弧和圆弧两个端点到中心连线所包围的区域。
- drawImage:绘制位图

7.菜单和列表

JMenu/JMenuItem/JMenuBar(菜单、菜单项、菜单条)
1.菜单条:类JMenuBar的实例就是菜单条。例如,以下代码创建菜单条对象menubar:
JMenuBar menubar = new JMenuBar();
在窗口中增设菜单条,必须使用JFrame类中的setJMenuBar()方法
例如,代码:setJMenuBar(menubar);

类JMenuBar的常用方法有:
- add(JMenu m):将菜单m加入到菜单条中
- countJMenus():获得菜单条中菜单条数
- getJMenu(int p):取得菜单条中的菜单
- remove(JMenu m):删除菜单条中的菜单m

2. 菜单:由类JMenu创建的对象就是菜单,类JMenu的常用方法如下:
- JMenu():建立一个空标题的菜单
- JMenu(String s):建立一个标题为s的菜单
- add(JMenuItem item):向菜单增加由参数item指定的菜单选项
- add(JMenu menu):向菜单增加由参数menu指定的菜单。实现在菜单嵌入子菜单
- addSeparator():在菜单选项之间画一条分隔线
- getItem(int n):得到指定索引处的菜单项
- getItemCount():得到菜单项数目
- insert(JMenuItem item,int n):在菜单的位置n插入菜单项item
- remove(int n):删除菜单位置n的菜单项
- removeAll():删除菜单的所有菜单项

3.菜单项:类JMenuItem 的实例就是菜单项。类JMenuItem的常用方法如下:
- JMenuItem():构造无标题的菜单项
- JMenuItem(String s):构造有标题的菜单项
- setEnabled(boolean b):设置当前单项是否可被选择
- isEnabled():返回当前菜单项是否可被用户选择
- getLabel():得到菜单项的名称
- setLabel():设置菜单选项的名称
- addActionListener(ActionListener e):为菜单项设置监视器。监视器接受点击某个菜单的动作事件

8.事件监听

什么是事件
- 用户用于交互而产生的键盘或鼠标动作
- 响应用户的动作称为处理事件

JAVA事件的委托机制
- 1.事件源先注册好监听器(监听器负责监听事件的产生),(监听器是实现监听器接口的类,监听器接口定义了一个要成为监听器的类应该实现的方法,同时监听器接口都继承与监听器接口基类java.util.EventListener 虽然这个接口没有定义任何需要实现的方法,但是它有它的用途,它作为一种标志,标志着继承自它的接口是监听器接口)
- 2.事件源产生事件(前提: 声明好相应的事件类,事件类都必须继承自JAVA的事件基类java.util.EventObject,EventObject(Object source)是EventObject唯一的构造方法,这意味着所有事件必须在实例化时就指定事件源,这一点很好,要求在产生事件的时候明确 是谁产生的 为后面的寻根提供保障)
- 3.事件源广播事件给任意一个在它上面注册的监听器
- 4.监听器接受事件并执行相应的事件处理方法

9.事件的处理机制

Java的事件处理机制
- 1.事件源(event source)
事件源是一个能够注册监听器对象并发送事件对象的对象。例如按钮或者滚动条就是事件源
- 2.事件,事件类型和事件对象
事件一般是用户在界面上的一个操作,当一个事件发生时,该事件用一个事件对象来表示,事件对象有对应的事件类
不同的事件类描述不同类型的用户动作,不同的事件源可以产生不同类别的事件。例如,按钮可以发送ActionEvent对象,而窗口可以发送WindowEvent对象,在Java中,所有的事件对象都最终派生于java.util.EventObject类
- 3.事件监听器(event listener)
监听器对象是一个实现了特定监听器接口(listener interface)的类的实例
事件监听器类(监听器对象所属的类)必须实现事件监听器接口或继承事件监听器适配器类
事件监听器接口定义了处理事件必须实现的方法
事件监听器适配器类是对事件监听器接口的简单实现。目的是为了减少编程的工作量
处理事件的方法被称为事件处理器,即事件监听器接口定义,并在事件监听器类中实现的方法
- 4.注册事件监听器
为了能够让事件监听器检查某个组件(事件源)是否发生了某些事件,并且在发生时激活事件处理器进行相应的处理,必须在事件源上注册事件监听器
这是通过使用事件源组件的以下方法来完成的:
addXxxListener(事件监听器对象)
Xxx对应相应的事件类

10.GUI编程实例

实例一:GUI记事本
enter image description here

package cn.guis;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
/**
* 记事本
* @author JEEP-711
*
*/
@SuppressWarnings("serial")
public class GuiNotepad extends JFrame{
JEditorPane je = null;//定义成员
//构造器
public GuiNotepad(){
/**
* 绘制界面
*/
this.setLayout(null);
JLabel jb = new JLabel();
setTitle("记事本");//窗口标题
this.setBounds(615, 98,836,908);//设置窗口宽为536像素,高为408像素
je = new JEditorPane();//创建文本框对象
je.setText("\r\n");//提示
je.setFont(new java.awt.Font("Dialog",1, 20));//设置字体样式
je.setSize(836,908);//设置宽高
add(je);//添加当前对象
setResizable(false);// 设置窗体是否可以调整大小,参数为布尔值
this.add(jb);//将其加入到窗口当中
/**
* 设置窗口图标
*/
Toolkit kit = Toolkit.getDefaultToolkit();
Image image = kit.getImage("src//image//0x1f4dd.png"); //设置窗口图标路径
setIconImage(image); //换掉窗体样式
/**
* 绘制菜单
* 文件菜单
*
*/
JEditorPane jee = new JEditorPane();
JMenuBar jr = new JMenuBar();//创建菜单条对象
JMenu jm = new JMenu("文件");
//新建项
JMenuItem ji = new JMenuItem();//创建菜单项对象
ji.setText("新建");
//动作事件接口
ji.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//jee.JEditorPane();//创建文本框对象
jee.setText("请输入内容: ");//提示
jee.setSize(836,908);//设置宽高
add(jee);//添加当前对象
}
});
this.add(ji);
/**
* 保存项
*/
JMenuItem bc = new JMenuItem("保存");//创建保存项
//动作事件接口
bc.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
try {
FileWriter fw = new FileWriter("src//记事本.txt",true);//实例化文件写入
fw.write(je.getText());//写入当前内容
fw.flush();//刷新
fw.close();//关闭流
System.out.println("成功保存");//提示
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch(NullPointerException e1){
System.out.println("您操作有误!");
}
}
});
this.add(bc);
/**
* 编辑菜单
*/
JMenu j1 = new JMenu(); //创建菜单对象
j1.setText("编辑");
JMenuItem jit = new JMenuItem();//创建菜单项对象
jit.setText("查找");
/**
* 格式菜单
*/
JMenu j2 = new JMenu(); //创建菜单格式对象
j2.setText("格式");
JMenuItem zt = new JMenuItem();//创建菜单项对象
zt.setText("字体");
/**
* 查看菜单
*/
JMenu j3 = new JMenu(); //创建菜单查看对象
j3.setText("查看");
JMenuItem ztl = new JMenuItem();//创建菜单项对象
ztl.setText("状态栏");
/**
* 帮助菜单
*/
JMenu j4 = new JMenu(); //创建菜单帮助对象
j4.setText("帮助");
JMenuItem jt = new JMenuItem();//创建菜单项对象
jt.setText("关于记事本");
/**
* 添加功能
*/
jm.add(ji);//把新建添加到菜单
jr.add(jm);//把菜单加载到菜单条
jr.add(j1);//把编辑添加到菜单条
j1.add(jit);//将查找添加到编辑
jr.add(j2);//把格式添加到菜单条
jr.add(j3);//把查看添加到菜单条
jr.add(j4);//把帮助添加到菜单条
j4.add(jt);//把关于记事本添加j4
j2.add(zt);//将字体加入到j2
j3.add(ztl);//将菜单项加入到菜单
jm.add(bc);//将保存加入到菜单
setDefaultCloseOperation(EXIT_ON_CLOSE);// 用户点击窗口关闭
this.setJMenuBar(jr);
this.setVisible(true);//设置是否窗口显示
}
//定义主方法
public static void main(String[] args){
new GuiNotepad();//调用方法
}
}


实例二:GUI用户猜数程序
enter image description here

package cn.gui;
import java.awt.Color;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
/**
* 猜数小程序
* @author JEEP-711
*
*/
@SuppressWarnings("serial")
public class Plays extends JFrame{
boolean flag = true;
Scanner info = new Scanner(System.in);
//构造方法
public Plays(){
/**
* 绘制界面
*/
this.setLayout(null);
JLabel jl = new JLabel();//实例化界面对象
setTitle("猜数游戏");//设置窗口标题
setResizable(false);//设置窗口不可调整大小
this.setBounds(560, 290,836, 510);//设置窗口大小
this.add(jl);//添加到窗口
/**
* 返回随机数文本输入框
*/
JTextArea jt = new JTextArea("游戏随机数:");//实例化文本框对象
jt.setBounds(215,105,140,50);//设置文本大小
jt.setFont(new java.awt.Font("宋体",0, 16));//设置字体样式
this.add(jt);//添加当前文本对象
jt.setBackground(new Color(231,210,181));
/**
* 用户输入数字文本框
*/
JTextArea ues = new JTextArea("请输入一个数字:");//实例化用户文本框对象
ues.setBounds(460,105,140,50);//设置文本大小
ues.setFont(new java.awt.Font("宋体",0, 15));//设置字体样式
this.add(ues);//添加当前文本对象
ues.setBackground(new Color(230,207,176));
/**
* 设置游戏开始按钮
*/
JButton jbn = new JButton("点击游戏开始");//实例化开始按钮对象
jbn.setBounds(218,205,140,50);//设置按钮位置
jbn.setFont(new java.awt.Font("Dialog",1, 15));//设置字体样式
jbn.setForeground(Color.white);//设置字体颜色
jbn.setBackground(new Color(8,163,219));//设置按钮颜色
//监听事件
jbn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//实例化线程
new Thread(new Runnable(){
@Override//覆写线程方法
public void run() {
//循环flag
while(flag){
int sj = (int)(Math.random()*95+5);//random*括号里的最大数减去最小数加最小数千位我认识的看风景阿斯蒂芬& & 聚少离多激发了考虑考虑我怎么知道扫你在哪啦圣诞节付款金额按乐山大佛萨顶顶 的
jt.setText(""+sj);//设置显示随机数框
try {
Thread.sleep(100);//睡眠100毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();//开始线程
}});
this.add(jbn);//添加当前开始按钮
/**
* 停止以后输出结果
*/
JLabel jg = new JLabel("--公布游戏结果--");
jg.setBounds(330, 270, 200, 30);
jg.setFont(new java.awt.Font("宋体",0, 12));//设置字体样式
this.add(jg);
/**
* 设置游戏结束按钮
*/
JButton jtn = new JButton("点击结束游戏");//实例化结束按钮对象
jtn.setFont(new java.awt.Font("Dialog",1, 15));//设置字体样式
jtn.setBounds(420,205,140,50);//设置按钮位置
jtn.setForeground(Color.white);//设置字体颜色
jtn.setBackground(new Color(8,163,219));//设置按钮颜色
//监听事件
jtn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
flag = false;//等于假就结束
//比较结果
if(ues.getText().equals(jt.getText())){
jg.setText("恭喜你猜对了,结果为:"+ues.getText());
}else{
jg.setText("你的输入不正确,"+"正确答案是:"+jt.getText());
}
}
});
this.add(jtn);//添加当前结束按钮
/**
* 设置窗口图标
*/
Toolkit kit = Toolkit.getDefaultToolkit();
Image image = kit.getImage("src//image//0x1f3ae.png"); //设置窗口图标路径
setIconImage(image); //换掉窗体样式
setDefaultCloseOperation(EXIT_ON_CLOSE);// 用户点击窗口关闭
/**
* 设置背景图片
*
*/
setSize(836, 510);//设置大小
String path = "src//image//timg.jpg";//设置背景图片的路径
ImageIcon background = new ImageIcon(path); // 背景图片
JLabel label = new JLabel(background);// 把背景图片显示在一个标签里面
label.setBounds(0, 0, this.getWidth(), this.getHeight()); // 把标签的大小位置设置为图片刚好填充整个面板
JPanel imagePanel = (JPanel) this.getContentPane(); // 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗& 格透明
imagePanel.setOpaque(false);
this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));// 把背景图片添加到分层窗格的最底层作为背景
this.setVisible(true);//设置是否窗口显示
}
//主方法
public static void main(String[] args) {
new Plays();//调用方法
}
}


实例三:GUI红绿灯程序
enter image description here

package cn.gui;
import java.awt.Color;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractButton;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
/**
* 交通警示灯-红 黄 绿 灯
* @author JEEP-711
*
*/
@SuppressWarnings({ "serial", "unused" })
public class WarningLight extends JFrame{
boolean flag = true;//定义成员属性,作为标记
//构造方法
public WarningLight(){
/**
* 绘制界面
*/
this.setLayout(null);
JLabel jl = new JLabel();//实例化界面对象
setTitle("交通信号灯程序");//设置标题
this.setBounds(515, 98,836,908);//设置窗口宽为836像素,高为908像素
this.add(jl);//将其加入到窗口当中
setResizable(false);// 设置窗体是否可以调整大小,参数为布尔值
setDefaultCloseOperation(EXIT_ON_CLOSE);// 用户点击窗口关闭
/**
* 设置开始按钮
*/
JButton begin = new JButton("点击开始");//实例化开始按钮
begin.setBounds(610,370,140,50);
begin.setFont(new java.awt.Font("Dialog",1, 15));//设置字体样式
begin.setForeground(Color.white);//设置字体颜色
begin.setBackground(new Color(8,163,219));//设置按钮颜色
/**
* 设置颜色
*/
// JTextArea area = new JTextArea();
// area.setBounds(200, 200, 400, 400);
// this.add(area);
/**
* 警示灯切换
*/
JLabel lb = new JLabel();//实例化对象
lb.setBounds(200,50,568,798);//设置宽高
jl.add(lb);//添加到jn里
this.add(lb);//添加当前的lb
/**
* 文字提示
*/
JLabel ts = new JLabel("交通信号提示");
ts.setBounds(586, 280, 200, 30);
ts.setFont(new java.awt.Font("黑体",1, 30));//设置字体样式
//jg.setForeground(Color.white);//设置字体颜色
add(ts);
//监听器,事件处理
begin.addActionListener(new ActionListener(){
@Override//覆写方法
public void actionPerformed(ActionEvent e) {
//匿名实例化线程
new Thread(new Runnable(){
@Override//覆写run方法
public void run() {
//循环标记
while(flag){
lb.setIcon(new ImageIcon("src//image//红灯.png"));//设置显示红灯png
lb.setSize(368,698);//设置宽高
//area.setBackground(Color.RED);
try {
ts.setText("红灯/停一停");
Thread.sleep(5200);//设置睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
lb.setIcon(new ImageIcon("src//image//黄灯.png"));//设置显示黄灯png
lb.setSize(368,698);//设置宽高
ts.setText("黄灯/等一等");
//area.setBackground(Color.YELLOW);
try {
Thread.sleep(2000);//设置睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
lb.setIcon(new ImageIcon("src//image//绿灯.png"));//设置显示绿灯png
lb.setSize(368,698);//设置宽高
ts.setText("绿灯/可通行");
// area.setBackground(Color.GREEN);
try {
Thread.sleep(5000);//设置睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();//开启线程
}
});
this.add(begin);//添加当前按钮
/**
* 设置结束按钮
*/
JButton end = new JButton("点击结束");//实例化结束按钮
end.setBounds(610,432,140,50);
end.setFont(new java.awt.Font("Dialog",1, 15));//设置字体样式
end.setForeground(Color.white);//设置字体颜色
end.setBackground(new Color(8,163,219));//设置按钮颜色
//事件处理
end.addActionListener(new ActionListener(){
@Override//覆写方法
public void actionPerformed(ActionEvent e) {
flag=false;//结束进程
}
});
this.add(end);//添加当前结束按钮
/**
* 设置窗口图标
*/
Toolkit kit = Toolkit.getDefaultToolkit(); //创建窗口图标对象
Image image = kit.getImage("src//image//0x1f6a6.png"); //设置窗口图标路径
setIconImage(image); //换掉窗体样式
/**
* 设置背景图片
*
*/
setSize(839, 908);//设置大小
String path = "src//image//交通安全灯.jpg";//设置背景图片的路径
ImageIcon background = new ImageIcon(path); // 背景图片
JLabel label = new JLabel(background);// 把背景图片显示在一个标签里面
label.setBounds(0, 0, this.getWidth(), this.getHeight()); // 把标签的大小位置设置为图片刚好填充整个面板
JPanel imagePanel = (JPanel) this.getContentPane(); // 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗& 格透明
imagePanel.setOpaque(false);
this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));// 把背景图片添加到分层窗格的最底层作为背景
this.setVisible(true);//设置是否窗口显示
}
//定义主方法
public static void main(String[] args) {
new WarningLight();//调用方法
}
}


实例四:GUI单机五子棋程序
enter image description here

package cn.gobang;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* 五子棋
* @author JEEP-711
*
*/
@SuppressWarnings("serial")
public class Gobangs extends JFrame{
/**
* 构造方法
*/
public Gobangs(){
/**
* 自定义组件
*/
this.setLayout(null);
this.setBounds(610, 140,630,630);//设置宽高
setTitle("国际五子棋");
setResizable(false);// 设置窗体是否可以调整大小,参数为布尔值
/**
* 开始按钮
*/
JButton dy = new JButton("开始对弈");//创建开始按钮
dy.setBounds(138,670,100,50);//设置位置
dy.setFont(new java.awt.Font("Dialog",1, 15));//设置字体样式
dy.setForeground(Color.white);//设置字体颜色
dy.setBackground(new Color(8,163,219));//设置按钮颜色
//监听器
dy.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Gobangss();//调用五子棋开始方法
}
});
this.add(dy);//添加当前对弈按钮
/**
* 悔棋按钮
*/
JButton hq = new JButton("悔棋");//创建悔棋按钮
hq.setBounds(270,670,100,50);//设置位置
hq.setFont(new java.awt.Font("Dialog",1, 15));//设置字体样式
hq.setForeground(Color.white);//设置字体颜色
hq.setBackground(new Color(8,163,219));//设置按钮颜色
//监听器
hq.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
}
});
this.add(hq);//添加当前悔棋按钮
/**
* 重新开始
*/
JButton cx = new JButton("重新开始");//创建重新开始对象
cx.setBounds(410,670,100,50);//设置位置
cx.setFont(new java.awt.Font("Dialog",1, 15));//设置字体样式
cx.setForeground(Color.white);//设置字体颜色
cx.setBackground(new Color(8,163,219));//设置按钮颜色
//监听器
cx.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//if(cx!= null){
Gobangss();//调用方法
//}
}
});
this.add(cx);//添加当前对象
/**
* 退出游戏
*/
JButton tc = new JButton("退出游戏");//创建退出按钮
tc.setBounds(545,670,100,50);//设置位置
tc.setFont(new java.awt.Font("Dialog",1, 15));//设置字体样式
tc.setForeground(Color.white);//设置字体颜色
tc.setBackground(new Color(8,163,219));//设置按钮颜色
//监听事件
tc.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.exit(1);//退出游戏界面
}
});
this.add(tc);//添加当前对象
/**
* 设置窗口图标
*/
Toolkit kit = Toolkit.getDefaultToolkit();
Image image = kit.getImage("src//image//0x1f3a8.png"); //设置窗口图标路径
setIconImage(image); //换掉窗体样式
/**
* 设置背景图片
*
*/
setSize(800,800);//设置大小 board 535, 536
String path = "src//image//qp.jpg";//设置背景图片的路径
ImageIcon background = new ImageIcon(path); // 背景图片
JLabel label = new JLabel(background);// 把背景图片显示在一个标签里面
label.setBounds(0, 0, this.getWidth(), this.getHeight()); // 把标签的大小位置设置为图片刚好填充整个面板
JPanel imagePanel = (JPanel) this.getContentPane(); // 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗& 格透明
imagePanel.setOpaque(false);
this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));// 把背景图片添加到分层窗格的最底层作为背景
setDefaultCloseOperation(EXIT_ON_CLOSE);// 用户点击窗口关闭
this.setVisible(true);//设置是否窗口显示
}
/**
* 创建五子棋开始方法
*/
public void Gobangss(){
Draw dr = new Draw();
//dr.setBounds(140,100,535,510);
dr.setBounds(140,100,535,510);
dr.addMouseListener(dr);
this.setBounds(610, 140,799,799);//设置宽高
this.add(dr);
}
public static void main(String[] args) {
new Gobangs();//调用方法
new Draw();//调用绘制五子棋类
}
}
/**
* 绘制五子棋盘,继承JComponet类
* @author JEEP-711
* 实现接口 MouseListener
*/
@SuppressWarnings("serial")
class Draw extends JComponent implements MouseListener{
private boolean isblack = true;//标记黑棋子先走
java.util.List<Pieces& psList = new ArrayList<Pieces&();//创建List对象,存放Pieces内容
private int pcesX = 0;//当前X棋子的位置
private int pcesY = 0;//当前Y棋子的位置
private boolean isNow = false;
//覆写方法,自定义控件
public void paint(Graphics g){
super.paint(g);
this.addMouseListener(this);//添加当前,注册自己
/**
* 绘制棋盘线,绘制棋子
* 十行十列,Y轴变换,X轴不变
*/
for(int i=-1;i<10;i++){
g.drawLine(0, (i*50+50), 500, (i*50+50));//x轴
g.drawLine((i*50+50),0,(i*50+50),500);//y轴
}
/**
* 绘制棋子
* 遍历集合棋子
*/
for(Pieces p : psList){
g.setColor(p.getColor());//取得棋子颜色,黑色
g.fillOval(p.getX(), p.getY(), Pieces.PIECES_SIZE,Pieces.PIECES_SIZE);//设置黑棋子的x,y轴,棋子大小
}
iswin();//调用方
if(isNow == true){
//g.setFont(new Font("微软雅黑",Font.ITALIC,24));
g.setColor(Color.WHITE);
g.setFont(new java.awt.Font("Dialog",1, 60));//设置字体样式
g.drawString("旗开得胜!", 110, 270);
}
}
/**
* 判断输赢
* 东,西,南,北
* 东北,东南,西南,西北
*/
public void iswin(){
/**
* --北方向
*/
int nanbei = 0;
for(int nowY = pcesY-50,i=0;i<5 && nowY&=0;nowY-=50,i++){
Pieces pieces = findPieces(pcesX,nowY);
//System.out.println(pieces);
//不等于空,就有棋子
if(pieces!= null){
//当前棋子等于黑,判断颜色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
nanbei++;
}else{
break;
}
}
//当前等于白棋,判断颜色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
nanbei++;
}else{
break;
}
}
}else{
break;
}
}if(isblack != true){
System.out.println("北方向黑棋子个数"+nanbei);
}else{
System.out.println("北方向白棋子个数"+nanbei);
}
if(nanbei&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋赢了");
}else{
System.out.println("白棋赢了");
}
}
/**
* --南方向
*/
for(int nowY = pcesY,i=0;i<5 && nowY<=500;nowY+=50,i++){
Pieces pieces = findPieces(pcesX,nowY);
//System.out.println(pieces);
//不等于空,就有棋子
if(pieces!= null){
//当前棋子等于黑,判断颜色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
nanbei++;
}else{
break;
}
}
//当前等于白棋,判断颜色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
nanbei++;
}else{
break;
}
}
}else{
break;
}
}if(isblack != true){
System.out.println("南方向黑棋子个数"+nanbei);
}else{
System.out.println("南方向白棋子个数"+nanbei);
}
if(nanbei&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋赢了");
}else{
System.out.println("白棋赢了");
}
}
/*
*--东方向
*
*/
int dongxi = 0;
for(int nowX = pcesX,i=0;i<5 && nowX<=500;nowX+=50,i++){
Pieces pieces = findPieces(nowX,pcesY);
//System.out.println(pieces);
//不等于空,就有棋子
if(pieces!= null){
//当前棋子等于黑,判断颜色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongxi++;
}else{
break;
}
}
//当前等于白棋,判断颜色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongxi++;
}else{
break;
}
}
}else{
break;
}
}
if(isblack != true){
System.out.println("东方向黑棋子个数"+dongxi);
}else{
System.out.println("东方向白棋子个数"+dongxi);
}
/**
* --西方向
*/
for(int nowX = pcesX-50,i=0;i<5 && nowX&=0;nowX-=50,i++){
Pieces pieces = findPieces(nowX,pcesY);
//不等于空,就有棋子
if(pieces!=null){
//当前棋子等于黑,判断颜色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongxi++;
}else{
break;
}
}
//当前等于白棋,判断颜色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongxi++;
}else{
break;
}
}
}else{
break;
}
}
if(isblack != true){
System.out.println("西方向黑棋子个数"+dongxi);
}else{
System.out.println("西方向白棋子个数"+dongxi);
}
if(dongxi&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋赢了");
}else{
System.out.println("白棋赢了");
}
}
/**
* -*-东北方向
*/
int dongbeixinan= 0;
for(int nowX = pcesX,nowY = pcesY,i=0;nowY &=0 && nowX<=500 && i< 5;nowX+=50,nowY-=50,i++){
Pieces pieces = findPieces(nowX,nowY);
//不等于空,就有棋子
if(pieces!=null){
//当前棋子等于黑,判断颜色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongbeixinan++;
}else{
break;
}
}
//当前等于白棋,判断颜色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongbeixinan++;
}else{
break;
}
}
}else{
break;
}
}
if(isblack != true){
System.out.println("东北方向黑棋子个数"+dongbeixinan);
}else{
System.out.println("东北方向白棋子个数"+dongbeixinan);
}
if(dongbeixinan&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋赢了");
}else{
System.out.println("白棋赢了");
}
}
/**
* --西南方向
*/
for(int nowX = pcesX-50,nowY = pcesY+50,i=0;nowY <=500 && nowX&=0 && i< 5;nowX-=50,nowY+=50,i++){
Pieces pieces = findPieces(nowX,nowY);
//不等于空,就有棋子
if(pieces!=null){
//当前棋子等于黑,判断颜色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongbeixinan++;
}else{
break;
}
}
//当前等于白棋,判断颜色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongbeixinan++;
}else{
break;
}
}
}else{
break;
}
}if(isblack != true){
System.out.println("西南方向黑棋子个数"+dongbeixinan);
}else{
System.out.println("西南方向白棋子个数"+dongbeixinan);
}
if(dongbeixinan&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋赢了");
}else{
System.out.println("白棋赢了");
}
}
/**
* --东南方向
*/
int dongnan = 0;
for(int nowX = pcesX,nowY = pcesY,i=0;nowY <=500 && nowX<=500 && i< 5;nowX+=50,nowY+=50,i++){
Pieces pieces = findPieces(nowX,nowY);
//不等于空,就有棋子
if(pieces!=null){
//当前棋子等于黑,判断颜色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongnan++;
}else{
break;
}
}
//当前等于白棋,判断颜色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongnan++;
}else{
break;
}
}
}else{
break;
}
}if(isblack != true){
System.out.println("东南方向黑棋子个数"+dongnan);
}else{
System.out.println("东南方向白棋子个数"+dongnan);
}
/**
* --西北方向
*/
for(int nowX = pcesX-50,nowY = pcesY-50,i=0;nowY &=0 && nowX&=0 && i< 5;nowX-=50,nowY-=50,i++){
Pieces pieces = findPieces(nowX,nowY);
//不等于空,就有棋子
if(pieces!=null){
//当前棋子等于黑,判断颜色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongnan++;
}else{
break;
}
}
//当前等于白棋,判断颜色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongnan++;
}else{
break;
}
}
}else{
break;
}
}
if(isblack != true){
System.out.println("西北方向黑棋子个数"+dongnan);
}else{
System.out.println("西北方向白棋子个数"+dongnan);
}
if(dongnan&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋赢了");
}else{
System.out.println("白棋赢了");
}
}
}
/**
* 找点
*/
public Pieces findPieces(int x,int y){
for(Pieces p:psList){
if(p.getX() == x && p.getY() == y){
return p;//判断坐标是否相同
}
}
return null;
}
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX()-Pieces.PIECES_SIZE/2;//取得x轴坐标
int y = e.getY()-Pieces.PIECES_SIZE/2;//取得y轴坐标
//算出在哪一条线
double xianX = Math.round(x/50.0);
double xianY = Math.round(y/50.0);
//System.out.println("第几根线"+xianY+"---"+Math.round(xianY));
x = ((int)xianX)*50-20;
y = ((int)xianY)*50-20;
pcesX = x;//记录棋子X当前位置
pcesY = y;//记录棋子Y当前位置
boolean isHa = false;
//去重复棋子
for(Pieces p:psList){
if(p.getX() == x && p.getY() == y){
isHa = true;
}
}
//避免重复棋子
if(!isHa){
Pieces ps = new Pieces(x,y); //创建棋子对象,并传x,y值
/**
* 找点
*/
if(isblack == true){
//黑棋子
ps.setColor(Color.BLACK);//设置棋子颜色为黑色
isblack = false;
}else{
//白棋子
ps.setColor(Color.WHITE);//设置棋子颜色为白色
isblack = true;
}
if(isNow==false){
psList.add(ps);//把棋子保存到数组里
}
this.repaint();//让其重新调用,用户触发,重新绘制
}
//System.out.println("目前棋子数为:"+psList.size());
//System.out.println("你点击了,X轴为:"+e.getX()+",Y轴为:"+e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
/**
* 绘制棋子类
* @author JEEP-711
*
*/
class Pieces{
private int x;//x轴点坐标属性
private int y;//y轴点坐标属性
private Color color;//棋子颜色属性
public static final int PIECES_SIZE = 40;//棋子尺寸
//取得X轴get方法
public int getX() {
return x;
}//设置x轴set方法
public void setX(int x) {
this.x = x;
}//取得y轴方法
public int getY() {
return y;
}//设置y轴方法
public void setY(int y) {
this.y = y;
}//取得棋子颜色方法
public Color getColor() {
return color;
}//设置棋子颜色方法
public void setColor(Color color) {
this.color = color;
}
//构造器
public Pieces(int x, int y, Color color) {
super();
this.x = x;
this.y = y;
this.color = color;
}
public Pieces(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Pieces [x=" + x + ", y=" + y + ", color=" + color + "]";
}
}

初学(JAVA GUI编程 高级阶段) 难点: ★★★★★

希望每一篇文章都能够对读者们提供帮助与提升,这乃是每一位笔者的初衷

感谢您的阅读 欢迎您的留言与建议

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号