使用Java2D改善API的绘制效果
---------------siwuxie095
工程名:TestSwingPaintAPI
包名:com.siwuxie095.swingpaint
类名:SwingPaintAPI.java(主类)、MyPanel.java
向 com.siwuxie095.swingpaint 包中放入图像文件:img.png
工程结构目录如下:
SwingPaintAPI.java(主类):
package com.siwuxie095.swingpaint; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.border.EmptyBorder; public class SwingPaintAPI extends JFrame { //将原本声明的 JPanel 注释掉,改为 MyPanel //private JPanel contentPane; private MyPanel contentPane;
/** * Launch the application. */ public static EventQueue.invokeLater(new Runnable() { public try { SwingPaintAPI frame = new SwingPaintAPI(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public SwingPaintAPI() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300);
//将原本的实例化方式注释掉,改为 MyPanel() //contentPane = new JPanel(); contentPane=new MyPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); } } |
MyPanel.java:
package com.siwuxie095.swingpaint; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; //使用 Java 2D 完成界面的绘图优化 //MyPanel 继承自 JPanel public class MyPanel extends JPanel {
//创建一个 BufferedImage BufferedImage image=null;
public MyPanel() {
try { //使用 ImageIO.read()读取图像,传入 URL //可以是本地图像,也可以是网络图像 //这里读取本地图像,因为使用的是 getClass().getResource() //所以 img.png 必须和调用的类 MyPanel 在同一个包中 //有异常抛出,使用 try catch 捕获 image=ImageIO.read(getClass().getResource("img.png"));
} catch (IOException e) { e.printStackTrace(); } }
//覆盖 JPanel 的 paintComponent() 方法, //右键->Source->Override/Implement Methods->JComponent //对于每一个组件来说,paintComponent() 方法是绘制组件本身 //传入 Graphics,通过它在界面绘制图像 @Override protected
//注释掉默认的从父类继承的绘图方法 //super.paintComponent(g);
//如果不使用 Java 2D,使用普通的绘图API, //则绘制的图像有很明显的锯齿
//创建一个 Graphics2D 对象:g2d,需要强转 //g2d 支持的属性和方法更多 Graphics2D g2d=(Graphics2D) g;
//图像渲染的提示,提示值代表了当前的绘图是否支持锯齿消除 //传入键值对,为Graphics2D添加抗锯齿 //(通过类调用静态值) g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Graphics2D 完全兼容 Graphics 的一些方法,包括 draw 和 fill 方法 //draw 方法绘制的都是线框、轮廓(空心),而 fill 方法绘制的是填充的图像(实心) //对于一般的 draw 方法,都会有对应的 fill 方法(空心对实心)
//Graphics2D 的 setClip() 方法 //需要指定 X Y 坐标,宽度,高度 //指定绘制图像的区域,超出就不会被绘制 g2d.setClip(0, 0, 500, 500);
//先使用 setColor() 为当前的绘图指定颜色 //使用匿名对象,创建一个新的Color对象 //可以为不同的形状填充不同的颜色 g2d.setColor(new Color(255,0,0));//红色
//绘制方块,需要指定 X Y 坐标,宽度,高度 // 0 0 即从左上角开始绘制 g2d.drawRect(0, 0, 100, 100);
//也可以使用静态方法通过类调用 g2d.setColor(Color.GREEN); //绘制圆形、椭圆形,需要指定 X Y 坐标,宽度,高度 //如果宽高一致,绘制的就是圆形 g2d.drawOval(0, 0, 100, 100);//圆形 g2d.setColor(Color.BLUE); g2d.drawOval(0, 25, 100, 50);//椭圆形
g2d.setColor(Color.ORANGE); //填充方块,需要指定 X Y 坐标,宽度,高度 g2d.fillRect(100, 100, 100, 100);
//填充带圆角效果的方块,需要指定 X Y 坐标,宽度,高度,圆角的弧宽,圆角的弧高 //一般情况下,将圆角的弧宽,圆角的弧高,两个弧度值设置成相等 //弧宽越大,则 X 方向上圆角越长,弧高越大,则 Y 方向上圆角越长 //弧宽与弧高指定了 X Y 方向上圆角的大小 g2d.fillRoundRect(200, 0, 100, 100, 10, 10); g2d.fillRoundRect(300, 100, 100, 100, 200, 50);
//绘制 String,需要指定 X Y 坐标 //绘制 Bytes Chars 同 String //设置颜色与字体 g2d.setColor(Color.YELLOW); g2d.setFont(new Font("Arial", Font.BOLD, 20)); g2d.drawString("TestAPI", 110, 50);
g2d.setColor(Color.CYAN); //绘制弧线 //绘制时按照逆时针绘制弧线 // //先画一个矩形,然后以这个矩形的中心为所要画的弧的中心, //以水平向右为 0 度,逆时针为正方向 g2d.drawArc(0, 200, 100, 100, 270, 90); g2d.fillArc(0, 200, 100, 100, 0, 270); g2d.fillArc(100, 200, 100, 200, 0, 90); g2d.drawArc(100, 200, 100, 200, 90, 90); g2d.fillArc(200, 200, 100, 200, 30, 120);
//绘制图像,选择传参最少的方法 //需要指定:图像对象image,X Y 坐标,observer(可指定为空) //对于 image 可以在构造函数 MyPanel() 中加载图像 if (image!=null) { g2d.drawImage(image, 0, 100, null); //绘制图像时可以指定图像的大小 }
//绘制线段时,线段可以指定粗细等属性 //第一个参数是线段的粗细, //第二个参数 CAP 表示线段头部的形状(圆/方等) //第三个参数 JOIN 表示线段曲折的地方的形状(尖/圆等) g2d.setStroke(new BasicStroke(5,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_ROUND));
g2d.setColor(new Color(0,0,0)); //绘制直线 g2d.drawLine(205, 105, 300, 200);
//绘制多边形,传入一组 X 坐标,一组 Y 坐标,和 g2d.fillPolygon(new g2d.drawPolygon(new
}
} |
修改 SwingPaintAPI.java(主类) 中的 contentPane 的
声明与实例化方式:
在
MyPanel.java 中覆盖 JPanel 的 paintComponent() 方法
右键->Source->Override/Implement Methods->JComponent
运行程序:
【made by siwuxie095】
使用Java2D改善API的绘制效果的更多相关文章
- 系统API执行没效果,可以检查一下是否与 360安全卫士 有关?!
今天在写一个工具软件,使用到一个系统API: mouse_event() 代码如下: mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x2, ...
- 【高德地图API】绘制大地线 Geodesic/Great Circles
大地线(geodesic)是指地球椭球面上连接两点的最短程曲线. 大地线上每点的密切面(无限接近的3个点所构成的平面)都包含此点的曲面法线.因曲面法线互不相交,故为一条空间曲面曲线.在球面上,大圆弧( ...
- WPF中如何使用图像API进行绘制
首先,由于WPF中不象GDI+中有Graphics对象,因此你无法使用Graphics进行绘图了,取而代之的是:DrawingContext:类似地,GDI+中的OnPaint已被OnRender取代 ...
- 11-Java 界面设计
(一)Java界面设计概述 1.Java 界面设计的用途 2.AWT 简介 (1)Abstract Windows Toolkit 是最原始的工具包. 3.Swing 简介 4.SWT 简介 5.如何 ...
- 在谷歌地图上绘制行政区域轮廓【结合高德地图的API】
实现思路: 1.利用高德地图行政区域API获得坐标列表 2.将坐标列表绘制在谷歌地图上[因为高德地图和国内的谷歌地图都是采用GCJ02坐标系,所有误差很小,可以不进行坐标误差转换] 注意点: 1.用百 ...
- 记录开发基于百度地图API实现在地图上绘制轨迹并拾取轨迹对应经纬度的工具说明
前言: 最近一直在做数据可视化方面的工作,其中平面可视化没什么难度,毕竟已经有很多成熟的可供使用的框架,比如百度的echart.js,highcharts.js等.还有就是3D可视化了,整体来说难度也 ...
- HTML5在canvas中绘制复杂形状附效果截图
HTML5在canvas中绘制复杂形状附效果截图 一.绘制复杂形状或路径 在简单的矩形不能满足需求的情况下,绘图环境提供了如下方法来绘制复杂的形状或路径. beginPath() : 开始绘制一个新路 ...
- canvas绘制图像轮廓效果
在2d图形可视化开发中,经常要绘制对象的选中效果. 一般来说,表达对象选中可以使用边框,轮廓或者发光的效果. 发光的效果,可以使用canvas的阴影功能,比较容易实现,此处不在赘述. 绘制边框 绘制 ...
- Java 2D API - 1. 基本概念
Java 2D API扩展AWT包,对二维图形.文本及成像功能提供了支持,可用于开发复杂的界面.绘图软件和图像编辑器.Java 2D对象位于用户坐标空间(User coordinate space), ...
随机推荐
- java重置Timer执行频率
public class BallUtil { public static Timer fisTimer ; public static void fisStartBall(){ long first ...
- axios 拦截 , 页面跳转, token 验证(自己摸索了一天搞出来的)
最近做项目,需要登录拦截,验证.于是使用了axios的拦截器(也是第一次使用,摸索了1天,终于搞出来了,真是太高兴啦!!!),废话不多说,直接上代码, 项目结构:vue-cli + webpack + ...
- Git_学习_07_ 推送修改到远端
一.操作流程 多人协作时,若自己的本地代码有了修改,想提交自己的代码,就需要按照以下步骤操作: 1.确认修改正确 使用以下命令,查看有哪些是自己未提交的代码 git status 2.拉取远程最新代码 ...
- LeetCode OJ:Path Sum(路径之和)
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...
- 条款36:绝对不要重新定义,继承而来的non-virtual函数
重新定义一个继承而来的non-virtual函数可能会使得导致当函数被调用的时候,被调用的函数不是取决于调用的函数究竟属于的对象,而是取决于调用函数的指针或者引用的类型. 所以一般的说主要有两种观点在 ...
- 201621123014《Java程序设计》第八周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 答: 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: Arr ...
- pdp 的连接方法
<?php $dsn = "mysql:host=127.0.0.1;dbname=blog_edu"; try{ $pdo = new PDO($dsn,'root','' ...
- MySql数据库约束
<MySQL技术内幕:InnoDB存储引擎>本书从源代码的角度深度解析了InnoDB的体系结构.实现原理.工作机制,并给出了大量实践,本着将书读薄的思想,循序渐进的记录对本书学习的读书笔记 ...
- Til the Cows Come Home (最短路模板题)
个人心得:模板题,不过还是找到了很多问题,真的是头痛,为什么用dijkstra算法book[1]=1就错了..... 纠结中.... Bessie is out in the field and wa ...
- Wireshark图解教程(简介、抓包、过滤器)【转载】
原文网址:http://blog.sina.com.cn/s/blog_5d527ff00100dwph.html Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网络中的数据, ...