Java图形界面编程
一、Java图形用户界面(gui)介绍
1、Java GUI简介
2、AWT和Swing的区别与联系
二、Swing的基本使用
1、几个常用的组件
2、Java布局管理
import java.awt.BorderLayout;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class MultiLayout extends JFrame {private static final long serialVersionUID = 1L;// 定义组件JPanel jp1, jp2;JButton jb1, jb2, jb3, jb4, jb5, jb6;public static void main(String[] args) {new MultiLayout();}public MultiLayout() {// 创建组件// JPanel布局默认是FlowLayout流布局jp1 = new JPanel();jp2 = new JPanel();jb1 = new JButton("西瓜");jb2 = new JButton("苹果");jb3 = new JButton("荔枝");jb4 = new JButton("葡萄");jb5 = new JButton("桔子");jb6 = new JButton("香蕉");// 设置布局管理器(Jpanel默认流布局)jp1.add(jb1);jp1.add(jb2);jp2.add(jb3);jp2.add(jb4);jp2.add(jb5);// 把Panel加入JFramethis.add(jp1, BorderLayout.NORTH);this.add(jb6, BorderLayout.CENTER);this.add(jp2, BorderLayout.SOUTH);// 设置窗体// 窗体大小this.setSize(300, 250);// 屏幕显示初始位置this.setLocation(200, 200);// 显示this.setVisible(true);// 退出窗体后将JFrame同时关闭this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
}
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextField;public class GroupLayoutTest extends JFrame {private static final long serialVersionUID = -5159330521192113057L;public static void main(String[] args) {new GroupLayoutTest();}JLabel label1;JLabel label2;JLabel label3;JTextField tf;JPasswordField psf;JRadioButton rb1;JRadioButton rb2;JButton bt1;JButton bt2;public GroupLayoutTest() {this.setVisible(true);this.setSize(250, 220);this.setVisible(true);this.setLocation(400, 200);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);label1 = new JLabel("登陆界面");label2 = new JLabel("账号:");label3 = new JLabel("密码:");tf = new JTextField();psf = new JPasswordField();rb1 = new JRadioButton("记住密码");rb2 = new JRadioButton("自动登陆");bt1 = new JButton("登陆");// 为指定的 Container 创建 GroupLayoutGroupLayout layout = new GroupLayout(this.getContentPane());this.getContentPane().setLayout(layout);// 创建GroupLayout的水平连续组,,越先加入的ParallelGroup,优先级级别越高。GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();// 添加间隔hGroup.addGap(5);hGroup.addGroup(layout.createParallelGroup().addComponent(label2).addComponent(label3));hGroup.addGap(5);hGroup.addGroup(layout.createParallelGroup().addComponent(label1).addComponent(psf).addComponent(rb1).addComponent(rb2).addComponent(tf).addComponent(bt1));hGroup.addGap(5);// 设置水平分组layout.setHorizontalGroup(hGroup);// 创建GroupLayout的垂直连续组,,越先加入的ParallelGroup,优先级级别越高。GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();vGroup.addGap(10);vGroup.addGroup(layout.createParallelGroup().addComponent(label1));vGroup.addGap(10);vGroup.addGroup(layout.createParallelGroup().addComponent(label2).addComponent(tf));vGroup.addGap(5);vGroup.addGroup(layout.createParallelGroup().addComponent(label3).addComponent(psf));vGroup.addGroup(layout.createParallelGroup().addComponent(rb1));vGroup.addGroup(layout.createParallelGroup().addComponent(rb2));vGroup.addGroup(layout.createParallelGroup(Alignment.TRAILING).addComponent(bt1));vGroup.addGap(10);// 设置垂直组layout.setVerticalGroup(vGroup);}}
三、Java绘图技术
1、Graphics类
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;public class GraphicsTest extends JFrame {// 定义组件MyPanel1 mp = null;public static void main(String[] args) {new GraphicsTest();}public GraphicsTest() {// 构建组件mp = new MyPanel1();// 加入组件this.add(mp);// 设置窗体this.setSize(400, 300);this.setVisible(true);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
}/*** @Description: 定义一个MyPanel(我自己的面板是用于绘图和显示绘图的区域)*/
class MyPanel1 extends JPanel {private static final long serialVersionUID = 1L;// 重写(覆盖)JPanel的paint方法public void paint(Graphics g) {// 1、调用父类函数,完成初始化任务super.paint(g);// 画一个直线g.drawLine(10, 10, 40, 10);// 画矩形边框g.drawRect(50, 50, 40, 40);// 画椭圆边框g.drawOval(130, 130, 60, 60);// 画填充矩形g.setColor(Color.blue);g.fillRect(10, 150, 70, 70);// 画填充椭圆// 设置画笔颜色g.setColor(Color.red);g.fillOval(270, 140, 100, 80);// 如何画出字g.setColor(Color.red);g.setFont(new Font("黑体", Font.BOLD, 40));g.drawString("祖国万岁", 150, 100);// 画弧形g.drawArc(100, 100, 120, 200, 50, 100);}
}
2、Graphics2D类
2.1、stroke属性
stroke属性控制线条的宽度、笔形样式、线段连接方式或短划线图案。该属性的设置需要先创建BasicStroke对象,再调用setStroke()方法来设置。创建BasicStroke对象的方法有:
BasicStroke(float w):指定线条宽w。
BasicStroke(float w, int cap, int join):
cap是端点样:CAP_BUTT(无修饰),CAP_ROUND(半圆形末端),CAP_SQUARE(方形末端,默认值)。
Join定义两线段交汇处的连接方式:JOIN_BEVEL(无修饰),JOIN_MTTER(尖形末端,默认值),JOIN_ROUND(圆形末端)。
2.2、paint属性
paint属性控制填充效果。先调用以下方法确定填充效果,理用setPaint()方法设置。
GradientPaint(float x1, float y1, Color c1, float x2, flaot y2, Color c2):从(x1, y1)到(x2, y2)颜色从c1渐变到c2。其中:参数c1, c2决定这个渐变色是从颜色c1渐变到颜色c2。参数x1, y1, x2, y2决定了渐变的强弱,即要求从点(x1, y1)出发到达点(x2, y2),颜色从c1变成c2。
GradientPaint(float x1, float y1, Color c1, float x2, float y2, Color c2, Boolean cyclic):如果希望渐变到终点又是起点的颜色,应将cyclic设置为true。
2.3、transform属性
transform 属性用来实现常用的图形平移、缩放和斜切等变换操作。首先创建AffineTransform对象,然后调用setTransform()方法设置transform属性。最后,用具有指定属性的Graphics2D对象绘制图形。创建AffineTransform对象的方法有:
getRotateinstrance(double theta):旋转theta弧度。
getRotateInstance(double theta, dioble x, double y):绕旋转中心(x, y)旋转。
getScaleInstance(double sx, double sy):x和y 方向分别按sx, sy比例变换。
getTranslateInstance(double tx, double ty):平移变换。
getShearInstance(double shx, double shy):斜切变换,shx和shy指定斜拉度。
也可以先创建一个没有transform属性的AffineTransform对象,然后用以下方法指定图形平移、旋转、缩放变换属性。
transelate(double dx, double dy):将图形在x轴方向平移dx像素。
scale(double sx, double sy):图形在x轴方向缩放sx倍,纵向缩放sy倍。
rotate(double arc, double x, double y):图形以点(x, y)为轴点,旋转arc弧度。
例如,创建AffineTransform对象:
AffineTransform trans = new AffineTransform();
为AffineTransform对象指定绕点旋转变换属性:
Trans.rotate(50.0*3.1415927/180.0,90,80);
接着为Graphics2D 的对象g2d设置具有上述旋转变换功能的“画笔”:
Graphics2D g2d = (Graphics2D)g; g2d.setTranstorm(trans);
最后,以图形对象为参数调用具有变换功能的Graphics2D 对象的draw()方法。例如,设已有一个二次曲线对象curve,以下代码实现用上述旋转功能的g2d对象绘制这条二次曲线:
g2d.draw(curve);
2.4、clip属性
clip属性用于实现剪裁效果。设置剪裁属性可调用setClip()方法确定剪裁区的Shape。连续多个setClip()得到它们交集的剪裁区。
2.5、composit属性
composit属性设置图形重叠区域的效果。先用方法AlphaComposite.getInstance(int rule, float alpha)得到AlphaComposite对象,再通过setComposite()方法设置混合效果。Alpha值的范围为0.0f(完全透明)-0.1f(完全不透明)。
2.6、Graphics2D类的绘图方法
Graphics2D类仍然保留Graphics类的绘图方法,同时增加了许多新方法。新方法将几何图形(线段、圆等)作为一个对象来绘制。在java.awt.geom包中声明的一系列类,分别用于创建各种身体图形对象。主要有:
Line2D线段类,RoundRectangle2D圆角矩形类,Ellipse2D椭圆类,Arc2D圆弧类,QuadCurve2D二次曲线类,CubicCurve2D三次曲线类。
要用Graphics2D类的新方法画一个图形。先在重画方法paintComponent()或paint()中,把参数对象g强制转换成Graphics2D对象;然后,用上述图形类提供的静态方法Double()创建该图形的对象;最后,以图形对象为参数调用Graphics2D对象的draw()方法绘制这个图形。例如以下代码用Graphics2D的新方法绘制线段和圆角矩形:
// 将对象g类型从Graphics转换成Graphics2D
Graphics2D g2d = (Graphics2D)g;
Line2D line = new Line2D.Double(30.0, 30.0, 340.0, 30.0);
g2d.draw(line);
RoundRectangle2D rRect = new RoundRectangle2D.Double(13.0, 30.0, 100.0, 70.0, 40.0, 20.0);
g2d.draw(rRect);
也可以先用java.awt.geom包提供的Shape对象,并用单精度Float坐标或双精度Double坐标创建Shape对象,然后再用draw()方法绘制。例如,以下代码先创建圆弧对象,然后绘制圆弧:
Shape arc = new Arc2D.Float(30, 30, 150, 150, 40, 100, Arc2D.OPEN);
g2d.draw(arc); //绘制前面创建的图形对象arc.
Graphics2D的几何图形类
1、线段:
// 声明并创建线段对象(起点是(2,3),终点是(200,300))
Line2D line = new Line2D.Double(2,3,200,300);
2、矩形:
// 声明并创建矩形对象,矩形的左上角是(20,30),宽是300,高是40。
Rectangle2D rect = new Rectangle2D.Double(20, 30, 80, 40);
3、圆角矩形:
// 左上角是(20,30),宽是130,高是100,圆角的长轴是18,短轴是15。
RoundRectangle2D rectRound = new RoundRectangle2D.Double(20, 30, 130, 100, 18, 15);
4、椭圆:
// 左上角 (20,30),宽是100,高是50
Ellipse2D ellipse = new Ellipse2D.Double(20, 30, 100, 50);
5、圆弧:
// 外接矩形的左上角(10,30),宽85,高60,起始角是5度,终止角是90度。
Arc2D arc1 = new Arc2D.Double(10, 30, 85, 60, 5, 90, Arc2D.OPEN);
Arc2D arc2 = new Arc2D.Double(20,65,90,70,0,180,Arc2D.CHORD);
Arc2D arc3 = new Arc2D.Double(40,110,50,90,0,270,Arc2D.PIE);
// 参数Arc2D.OPEN、Arc2D.CHORD、Arc2D.PIE分别表示圆弧是开弧、弓弧和饼弧。
6、二次曲线:
二次曲线用二阶多项式表示:y(x) = ax2+bx+c。一条二次曲线需要三个点确定:始点、控制点和终点。
QuadCurve2D curve1 = new QuadCurver2D.Double(20,10,90,65,55,115);
QuadCurve2D curve2 = new QuadCurver2D.Double(20,10,15,63,55,115);
QuadCurve2D curve3 = new QuadCurver2D.Double(20,10,54,64,55,115);
// 方法Double()中的6个参数分别是二次曲线的始点、控制点和终点。以上3条二次曲线的开始点和终点分别相同。
7、三次曲线:
三次曲线用三阶多项式表示:y(x)=ax3+bx2+cx+d。一条三次曲线需要四个点确定:始点、两个控制点和终点。
CubicCurve2D curve1 = new CubicCurve2D.Double(12,30,50,75,15,15,115,93);
CubicCurve2D curve2 = new CubicCurve2D.Double(12,30,15,70,20,25,35,94);
CubicCurve2D curve3 = new CubicCurve2D.Double(12,30,50,75,20,95,95,95);
方法Double()中的8个参数分别是三次曲线的始点、两个控制点和终点。
一般的方程曲线的绘制过程用一个循环控制。通过循环产生自变量的值,按照方程计算出函数值,再作必要的坐标转换:原点定位的平移变换,图像缩小或放大的缩放变换,得到曲线的图像点,并绘制这个点。以绘制以下曲线方程为例:
Y=sin(x)+cos(x)
绘制的部分代码可以写成如下:
double x0, y0, x1, y1, x2, y2, scale;
x0 = 100; y0 = 80;
scale = 20.0;
for(x1 = -3.1415926d; x1 <= 2*3.1415926d; x1 += 0.01d) {y1 = Math.sin(x1) + Math.cos(x1);x2 = x0 + x1 * scale; y2 = y0 + y1 * scale; //(x2,y2)是图像点g.fillOval((int)x2, (int)y2, 1, 1); // 画一个圆点作为图像点
}
四、事件处理机制
事件类 | 说明 |
---|---|
ActionEvent | 通常在按下按钮,或双击一个列表项或选中某个菜单时发生 |
AdjustmentEvnet | 当操作一个滚动条时发生 |
ComponentEvent | 当一个组件隐藏、移动、改变大小时发送 |
ContainerEvent | 当一个组件从容器中加入或者删除时发生 |
FocusEvent | 当一个组件获得或是失去焦点时发生 |
ItemEvent | 当一个复选框或是列表项被选中时,当一个选择框或选择菜单被选中 |
KeyEvent | 当从键盘的按键被按下,松开时发生 |
MouseEvent | 当鼠标被拖动、移动、点击、按下… |
TextEvent | 当文本区和文本域的文本发生改变时发生 |
WindowEvent | 当一个窗口激活、关闭、失效、恢复、最小化… |
3、事件监听器接口
事件源产生一个事件,可以传送给事件监听者处理,那么怎样才能编写一个事件监听者呢?
事件监听者实际上就是一个类,该类实现了某个事件监听器接口,它就可以作为一个事件监听者,对接受到的事件进行处理。
事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现一个事件监听接口,也可以实现多个监听接口,这些接口在java.awt.event和javax.swing.event包中定义。
Java图形界面编程相关推荐
- Java图形编程实验总结_实验二java图形界面编程2015级.doc
实验二java图形界面编程2015级.doc 实验二JAVA图形界面编程一.实验目的熟悉JAVA运行环境,编程掌握JAVASWING组件的图形界面编程.二.实验环境微机,软件MYECLIPSE,JDK ...
- Java图形界面编程模拟ATM自助取款系统
本人学习Java时一直想做一个图形界面的程序,所以利用闲暇时间,做了一个Java图形界面编程模拟ATM自助取款系统,界面简洁漂亮,基本功能ATM功能实现. 程序初始时 考号:123456 密码:123 ...
- java图形界面多线程_多线程编程、Java I/O系统和Java图形界面编程
多线程编程: 一个正在运行的程序通常称为一个进程,每一个任务称为一个线程,中能够在一个程序内运行多线程的程序称为多线程程序. 线程与进程的区别:①每个进程都需要操作系统为其分配独立的内存空间: ②而同 ...
- java图形界面编程 房子_Java图形界面编程
AWT简介 AWT是抽象窗口工具箱:其中包含了图形界面开发的基本类库. AWT主要包括:容器,布局管理器,事件处理,基本组件四个部分. 容器:用于放置基本组件 布局管理器:对容器中的组件进行布局管理 ...
- java图形界面编程视频,mysql数据库引擎面试
拼多多三面惨败,java中间件.数据库与spring框架,答不上- 面试开火箭,工作拧螺丝-月初有个朋友面试拼多多,一面自信满满过了,结果三面却惨败-昨天朋友约我出来讨论问题在哪里,三面就答不上了(卡 ...
- java图形界面编程如何给窗口设置背景图片
文章目录 前言 一.知识点介绍 二.代码实现 总结 前言 相信大家在GUI编程过程中,也就是开发窗口程序过程中,比如游戏界面等,难免会需要给窗口添加背景图片,接下来我将给大家详细讲解如何给窗口设置背景 ...
- Java图形界面编程--界面版猜数字游戏
界面版猜数字游戏 package com.lddx.day0305;import java.awt.Color; import java.awt.event.ActionEvent; import j ...
- Kafka的生产者原理及重要参数说明,java图形界面编程视频
============================================================================ 此时生产者不着急把消息发送出去,而是先放到一个 ...
- Java图形界面编程练习——五子棋程序
1.一些对象和静态常量的定义 //定义三个BufferedImage,分别代表棋盘图.黑子图.白子图private BufferedImage table;private BufferedImage ...
最新文章
- EEGLAB处理脑电视频教程 part1-3
- Bluetooth Low Energy 嗅探
- android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事...
- MySQL联合查询介绍
- Swagger在header中添加token
- python列表统计每个元素出现次数_python 统计list中各个元素出现的次数的几种方法...
- Linux 进程管理数据结构
- 数据库备份、还原的处理
- Swift仿写喜马拉雅FM
- side-by-side
- 字节跳动宣布要做全网搜索,百度真正的危机来了
- 论文笔记_S2D.38_2018-CVPR_DORN_用于单目深度估计的深度有序回归网络
- Morris Traversal
- 神经网络加速器设计研究:GoSPA ISCA2021论文研读
- 计算机毕业设计-springboot协同办公管理系统-公文流转系统代码设计-多人协同办公讨论管理系统
- 公共基础知识:地理之八大行星
- DiskLruCache 源码分析
- HTML+CSS 基础 之页签
- 著名歌唱家大衣哥太豪横了,参加商演被主办方请到五星级酒店就餐
- .unl 文件 导入 mysql,导入数据到informix数据库问题