绘图原理(1)
Component类提供了两个和绘图相关最重要的⽅法:
1、 paint(Graphics g)绘制组件的外观
2、 repaint()刷新组件的外观
当组件第⼀次在屏幕显示的时候,程序会⾃动的调paint()来绘制组件

绘图原理(2)
在以下情况paint()将会被调⽤:
1、窗⼝最小化,再最大化
2、窗⼝的大小发⽣变化
3、 repaint函数被调

import javax.swing.*;
import java.awt.*;
/*
栗子 Java绘图基础
*/ //定义一个MyPanel(我自己的面板是用于绘图和显示绘图的区域)
class MyPanel extends JPanel{
//重写父类JPanel的paint方法
public void paint(Graphics g){
//1. 调用父类函数,完成初始化任务
super.paint(g);//super.paint(g)这句话不能少
System.out.println("Paint被调用");
//2. paint调用,先画一个圆
g.drawOval(10,10,30,30); }
}
public class Test_Graphics extends JFrame {
MyPanel mp = null; public Test_Graphics(){
mp = new MyPanel();
this.add(mp);
this.setSize(400,300);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args){
Test_Graphics th = new Test_Graphics();
} }

import javax.swing.*;
import java.awt.*;
/*
栗子 Graphics类你可以理解就是画笔,为我们提供了各种绘制图形的⽅法: [多看jdk帮助⽂档]
1、画直线 drawLine(int x1,int y1,int x2,int y2);
2、画矩形边框 drawRect(int x,int y,int width,int height);
3、画椭圆边框 drawOval(int x,int y,int width,int height);
4、填充矩形 fillRect(int x,int y,int width,int height);
5、填充椭圆 fillOval(int x,int y,int width,int height);
6、画图⽚ drawImage(Image img.int x,int y,..);
7、画字符串 drawString(String str,int x,int y);
8、设置画笔的字体 setFont(Font font);
9、设置画笔的颜⾊ setColor(Color c);
*/ //定义一个MyPanel(我自己的面板是用于绘图和显示绘图的区域)
class MyPanel extends JPanel{
//重写父类JPanel的paint方法
public void paint(Graphics g){
//1. 调用父类函数,完成初始化任务
super.paint(g);//super.paint(g)这句话不能少
//画直线
g.drawLine(10,10,40,10);
//矩形边框
g.drawRect(50,50,40,40);
//椭圆边框
g.drawOval(100,100,60,60);
//填充矩形
g.setColor(Color.blue);
g.fillRect(10,150,70,70);
//填充椭圆
g.setColor(Color.red);
g.fillOval(200,50,80,80);
}
}
public class Test_Graphics extends JFrame {
MyPanel mp = null; public Test_Graphics(){
mp = new MyPanel();
this.add(mp);
this.setSize(400,300);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args){
Test_Graphics th = new Test_Graphics();
} }

import javax.swing.*;
import java.awt.*;
/*
栗子 画图片 画字
*/ //定义一个MyPanel(我自己的面板是用于绘图和显示绘图的区域)
class MyPanel extends JPanel{
//重写父类JPanel的paint方法
public void paint(Graphics g){
//1. 调用父类函数,完成初始化任务
super.paint(g);//super.paint(g)这句话不能少
//在画板上画图片
System.out.println(getClass());
Image im = Toolkit.getDefaultToolkit().getImage("D:\\zidonghua\\java_test_one\\images\\dog.jpg");
//下面的方法就不行,因为这里的getClass()的路径是编译后的路径,即使从target开始往下找的路径
//Image im = Toolkit.getDefaultToolkit().getImage(getClass().getResource("D:\\zidonghua\\java_test_one\\images\\dog.jpg"));
//实现
g.drawImage(im,0,0,300,200,this);
//画字
g.setColor(Color.red);
g.setFont(new Font("黑体",Font.BOLD,40));
g.drawString("祖国万岁",100,100);
//画弧形
g.drawArc(100,100,120,200,-50,-100);
}
}
public class Test_Graphics extends JFrame {
MyPanel mp = null; public Test_Graphics(){
mp = new MyPanel();
System.out.println(" " + getClass());
this.add(mp);
this.setSize(400,300);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args){
Test_Graphics th = new Test_Graphics();
} }

【备注】java中Class.getResource用法(用于配置文件的读取)

  用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file = new File("c:/test.txt");这样用有什么问题,相信大家都知道,就是路径硬编码,对于JAVA精神来说,应用应该一次成型,到处可用,并且从现实应用来讲,最终生成的应用也会部署到Windows外的操作系统中,对于linux来说,在应用中用了c:/这样的字样,就是失败,所以,我们应该尽量避免使用硬编码,即直接使用绝对路径。

 在Servlet应用中,有一个getRealPath(String str)的方法,这个方法尽管也可以动态地获得文件的路径,不秘直接手写绝对路径,但这也是一个不被建议使用的方法,那么,我们有什么方法可以更好地获得文件呢?

那就是Class.getResource()与Class.getResourceAsStream()方法,但很多人还是不太懂它的用法,因为很多人(比如不久前的我)都不知道应该传怎么样的参数给它,当然,有些人己经用得如火纯青,这些人是不需要照顾的,在此仅给不会或者还不是很熟的人解释一点点

比如我们有以下目录

|--project

|--src

|--javaapplication

|--Test.java

|--file1.txt

|--file2.txt

|--build

|--javaapplication

|--Test.class

|--file3.txt

|--file4.txt

在上面的目录中,有一个src目录,这是JAVA源文件的目录,有一个build目录,这是JAVA编译后文件(.class文件等)的存放目录

那么,我们在Test类中应该如何分别获得

file1.txt  file2.txt  file3.txt  file4.txt这四个文件呢?

首先讲file3.txt与file4.txt

file3.txt:

方法一:File file3 = new File(Test.class.getResource("file3.txt").getFile());

方法二:File file3 = new File(Test.class.getResource("/javaapplication/file3.txt").getFile());

方法三:File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());

file4.txt:

方法一:File file4 = new File(Test.class.getResource("/file4.txt").getFile());

方法二:File file4 = new File(Test.class.getClassLoader().getResource("file4.txt").getFile());

很好,我们可以有多种方法选择,但是file1与file2文件呢?如何获得?

答案是,你只能写上它们的绝对路径,不能像file3与file4一样用class.getResource()这种方法获得,它们的获取方法如下

假如整个project目录放在c:/下,那么file1与file2的获取方法分别为

file1.txt

方法一:File file1 = new File("c:/project/src/javaapplication/file1.txt");

方法二:。。。没有

file2.txt

方法一:File file2 = new File("c:/project/src/file2.txt");

方法二:。。。也没有

总结一下,就是你想获得文件,你得从最终生成的.class文件为着手点,不要以.java文件的路径为出发点,因为真正使用的就是.class,不会拿个.java文件就使用,因为java是编译型语言嘛

至于getResouce()方法的参数,你以class为出发点,再结合相对路径的概念,就可以准确地定位资源文件了,至于它的根目录嘛,你用不同的IDE build出来是不同的位置下的,不过都是以顶层package作为根目录,比如在Web应用中,有一个WEB-INF的目录,WEB-INF目录里面除了web.xml文件外,还有一个classes目录,没错了,它就是你这个WEB应用的package的顶层目录,也是所有.class的根目录“/”,假如clasaes目录下面有一个file.txt文件,它的相对路径就是"/file.txt",如果相对路径不是以"/"开头,那么它就是相对于.class的路径。。

还有一个getResourceAsStream()方法,参数是与getResouce()方法是一样的,它相当于你用getResource()取得File文件后,再new InputStream(file)一样的结果

Windows绝对路径:

以盘符开始 如C:/a.txt 
Windows相对路径: 
.      指的是当前目录 
..     指的是当前目录的上一级目录 
./test 表示当前目录下的test文件夹 
/test  表示当前盘符下的test文件夹 
  www.2cto.com  
Linux绝对路径:
 
以root根目录/开始的路径 如/ 表示root根目录 
Linux相对路径: 
./     指的是当前目录 
../    指的是当前目录的上一级目录 
 
.代表当前目录,..代表上级目录 好像是统一的。

在windows或者Linux获取配置文件如:.properties文件时

使用Class.getResource或者ClassLoader.getResource获取绝对路径classpath时返回的值如下不同

1
String basepath=Thread.currentThread().getContextClassLoader().getResource("").toString();

  

Windows输出

1
basepath=file:/D:/Workspaces/edu.bizoss.com/WebRoot/WEB-INF/classes/

 

Linux输出

1
basepath=file:/Workspaces/edu.bizoss.com/WebRoot/WEB-INF/classes/

  

因此获取绝对路径的截取的也就不同

1
2
3
4
5
if(System.getProperty("file.separator").equals("\\")){
return basepath.substring(6,basepath.length());
}else{
return basepath.substring(5,basepath.length());
}

【Java】【绘图】的更多相关文章

  1. java基础 绘图技术.坦克大战 之java绘图坐标体系(一)

    坐标体系介绍 下图说明了java坐标体系.坐标原点位于左上角,以像素为单位,像素是计算机屏幕上最小的显示单位.在java的坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素:第二个 ...

  2. java 绘图

    java 绘图 圆形.线条.矩形.填充 插入图片 文字 //绘图 import java.awt.*; import javax.swing.*; public class Index extends ...

  3. java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法

    /** *@author blovedr * 功能: java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法 * 日期: 2018年4月28日     16:20 * 注释: ...

  4. java绘图(基于Graphics2D)

    1.绘图基本操作 请参考下面基础示例: int width = 200, height = 250; //创建图片对象 BufferedImage image = new BufferedImage( ...

  5. Java Web-servlet、HTTP in servlet和捎带的Java绘图学习

    Java Web-servlet.HTTP in servlet和捎带的Java绘图学习 server applet:运行在服务器端的小程序 动态项目的动态内容的java类依赖于服务器才能运行,由to ...

  6. Java绘图基础

    <零基础学Java> Java绘图基础 绘图是高级程序设计中非常重要的技术,例如,应用程序需要绘制闪屏图像.背景图像.组件外观Web程序可以绘制统计图.数据库存储的图像资源等. Graph ...

  7. java基础 绘图技术.坦克大战 之java绘图坐标体系(二)

    功能:在坐标系上绘制坦克 /* * 功能:坦克游戏的1.0 * 1. 画出坦克 * */ package com.tank; import javax.swing.*; import java.awt ...

  8. 【java版坦克大战---准备篇】 java 绘图

    要写坦克大战当然要先画出坦克.java画图是基础. package com.game; import java.awt.*; import javax.swing.*; public class Pr ...

  9. java绘图合并图像AlphaComposite模式测试

    package com.hdwang.test; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.sw ...

  10. java绘图drawString位置的确定

    根据api,很容易知道使用方式如下: 指定字符串和坐标即可. 但是简单认为字符串的起始位置就是左上顶点就错了,这样画起来每次的位置都不对,字体的大小不同,位置偏差很大.仔细看api注释后发现,y坐标是 ...

随机推荐

  1. Step1:SQL Server 复制介绍

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 前言(Introduction) 复制逻辑结构图(Construction) 系列文章索引(Catalog) 总结&am ...

  2. linux下VLAN设置

    1. 安装vlan(vconfig)和加载8021q模块 [root@test0001~]#yum install vconfig [root@test0001~]#modprobe 8021q [r ...

  3. windows composer 安装,使用新手入门

    一.前期准备: 1.下载安装包,https://getcomposer.org/download/ 2.在php.ini文档中打开extension=php_openssl.dll 3.下载php_s ...

  4. fjwc2019 D1T2 原样输出(后缀自动机+dp)

    #179. 「2019冬令营提高组」原样输出 暴力对每个串建后缀自动机,然后暴力枚举每个自动机的子串.可以拿到部分分. 然鹅我们可以把每个后缀自动机连起来. 我们知道,后缀自动机是用最少的点(空间)表 ...

  5. JDK常用命令(三)jmap

    jmap jmap,Java Memory Map.主要用于打印指定Java进程(或核心文件.远程调试服务器)的共享对象内存映射或堆内存细节. jmap命令可以获得运行中的jvm的堆的快照,从而可以离 ...

  6. java常用代码段整理(持续更新)

    FileWriter指定编码格式 FileWriter 默认是用(ISO-8859-1 or US-ASCII)西方编码的,总之不是UTF-8的,而FileWriter类有getEncoding方法, ...

  7. Java常用API-高级

    ---恢复内容开始--- Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.所有类在创建对象的时候,最终找的父类就是Object. * String toStri ...

  8. topcoder srm 698 div1 -3

    1.定义重复串$S=T+T$,即$S$可以表示成一个串的叠加.给定一个串$s$,可以通过删除字符.修改字符.增加字符来使得其变为重复串.问最少的次数. 思路:首先将$s$分成个串$s_{0},s_{1 ...

  9. uniGUI试用笔记(八)

    在业务系统中常常使用回车键(Enter)替代Tab键完成焦点跳转,在uniGUI下,可以不用代码,直接使用TUniForm的NavigateKeys进行设置: 其中Next和Prior决定了焦点向下一 ...

  10. tp剩余未验证内容-4

    关于pop-up被blocked的问题 首先 这个pop-up的功能叫 popup blocker , 它是浏览器(包括ff, chrome等) 自身 所内置 的一个功能, 不是 安装的外部 插件/或 ...