JAVA图形与文本基础_理想主义文艺青年的博客-程序员秘密

技术标签: JAVA  

1.绘制线段

给出三条线段中两个端点的坐标 绘制三条线段

<span style="font-family:KaiTi_GB2312;font-size:18px;">import javax.swing.*;
import java.awt.*;

public class DrawLinePanel extends JPanel{
	public static void main(String args[]){
		JFrame frame=new JFrame("DrawLine");
		frame.getContentPane().add(new DrawLinePanel());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(300,200);
		frame.setVisible(true);
	}
	
	public void paint(Graphics g){
		//super.paint(g);
		g.drawLine(70,50,180,50);
		g.drawLine(70,80,180,80);
		g.drawLine(110,10,140,120);
	}
}
</span></span>


2.绘制矩形

给出矩形左上角的坐标和宽度高度 画出空心矩形和实心矩形

(若要画正方形 把里面的宽度和高度设置成一样的即可)

<span style="font-family:KaiTi_GB2312;font-size:18px;">import javax.swing.*;
import java.awt.*;

public class DrawRectangle extends JPanel{
	public static void main(String args[]){
		JFrame frame=new JFrame("DrawRectangle");
		frame.getContentPane().add(new DrawRectangle());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(300,200);
		frame.setVisible(true);
	}
	public void paint(Graphics g){
		g.drawRect(30,40,80,60);//左上角的坐标 矩形的宽度 高度
		g.fillRect(140,40,80,60);//实心矩形
	}
}
</span></span>

同样的 使用相应的函数 也可以画出椭圆 圆弧 多边形等图形



3.设置笔画的粗细

使用Graphics2D来修改笔画对象参数 设置粗细

<span style="font-family:KaiTi_GB2312;font-size:18px;">import javax.swing.*;

import java.awt.*;
import java.awt.geom.Ellipse2D;

public class ChangeStrokeWidth extends JPanel{
	public static void main(String args[]){
		JFrame jf=new JFrame("设置笔画的粗细");
		jf.getContentPane().add(new ChangeStrokeWidth());
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(300,200);
		jf.setVisible(true);
	}
	public void paint(Graphics g){
		Graphics2D g2=(Graphics2D)g;
		BasicStroke stroke=new BasicStroke(1);//创建宽度是1的笔画对象
		g2.setStroke(stroke);
		Ellipse2D.Float ellipse=new Ellipse2D.Float(20,20,100,60);
		g2.draw(ellipse);
		stroke=new BasicStroke(4);
		g2.setStroke(stroke);
		ellipse=new Ellipse2D.Float(160,20,100,60);
		g2.draw(ellipse);
		
	}
}
</span>

4.缩放图形

通过按钮来控制对图形的缩放

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;

public class ZoomShape extends JFrame{
	int flag=0;//表示点击按钮的状态   0表示点击还原 1放大 2缩小
	ZoomShapePanel zoomPanel=new ZoomShapePanel();
	
	public static void main(String args[]){
		ZoomShape jf=new ZoomShape();//创建窗体类的实例
		jf.setVisible(true);
	}
	
	public ZoomShape(){
		super();
		setTitle("缩放图形");
		setBounds(100,100,338,220);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		add(zoomPanel);//将面板类的实例添加到窗体容器中
		final JPanel panel=new JPanel();
		final FlowLayout flowLayout=new FlowLayout();
		flowLayout.setHgap(30);
		panel.setLayout(flowLayout);
		getContentPane().add(panel,BorderLayout.SOUTH);
		
		final JButton btn_large=new JButton();
		btn_large.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				flag=1;
				zoomPanel.repaint();//重新调用面板的paint()方法				
			}
		});
		btn_large.setText("放大");
		panel.add(btn_large);
		
		final JButton btn_small=new JButton();
		btn_small.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				flag=2;
				zoomPanel.repaint();
			}
		});
		btn_small.setText("缩小");
		panel.add(btn_small);
		
		final JButton btn_restore=new JButton();
		btn_restore.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				flag=0;
				zoomPanel.repaint();				
			}
		});
		btn_restore.setText("还原");
		panel.add(btn_restore);
	}
	
	class ZoomShapePanel extends JPanel{//内部面板类
//		float x,y;
//		x=(float) 80.0; y=(float) 50.0;
		public void paint(Graphics g){
			
			Graphics2D g2=(Graphics2D)g;
			float x,y;
			x=(float) 80.0; y=(float) 50.0;
			Rectangle2D.Float rect=new Rectangle2D.Float(120,50,x,y);
			BasicStroke stroke=new BasicStroke(10);
			g2.setStroke(stroke);
			g2.clearRect(0,0,338,220);
			if(flag==0){
				g2.draw(rect);
			}else if(flag==1){
				x=(float) (x*1.2); y=(float) (y*1.2);
//				g2.scale(1.2,1.2);//横坐标放大的倍数 纵坐标放大的倍数
				rect=new Rectangle2D.Float(120,50,x,y);
				g2.draw(rect);
			}else{
				x=(float) (x*0.8); y=(float) (y*0.8);
				rect=new Rectangle2D.Float(120,50,x,y);
//				g2.scale(0.8,0.8);
				g2.draw(rect);
			}
		}
	}
}


5.旋转图形

通过按钮来控制对图形的旋转

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;

public class RotateShape extends JFrame{
	int flag=0;//还原0 顺1 逆2
	double rotateValue=0.0;
	RotateShapePanel rotatePanel=new RotateShapePanel();
	
	public static void main(String args[]){
		RotateShape jf=new RotateShape();
		jf.setVisible(true);
	}
	
	public RotateShape(){
		super();
		setTitle("旋转图形");
		setBounds(100,100,338,220);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		add(rotatePanel);
		final JPanel panel=new JPanel();
		final FlowLayout flowLayout=new FlowLayout();
		flowLayout.setHgap(30);
		panel.setLayout(flowLayout);
		getContentPane().add(panel,BorderLayout.SOUTH);
		
		JButton jbt_shun=new JButton();
		jbt_shun.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				flag=1;
				rotateValue+=0.1;
				rotatePanel.repaint();
			}
			
		});
		jbt_shun.setText("顺时针");
		panel.add(jbt_shun);
		
		JButton jbt_ni=new JButton();
		jbt_ni.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				flag=2;
				rotateValue-=0.1;
				rotatePanel.repaint();
			}
			
		});
		jbt_ni.setText("逆时针");
		panel.add(jbt_ni);
		
		JButton jbt_restore=new JButton();
		jbt_restore.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				flag=0;
				rotateValue=0.0;
				rotatePanel.repaint();
			}
			
		});
		jbt_restore.setText("还原");
		panel.add(jbt_restore);
		
	}
	
	class RotateShapePanel extends JPanel{
		public void paint(Graphics g){
			Graphics2D g2=(Graphics2D)g;
			Rectangle2D.Float rect=new Rectangle2D.Float(40,40,80,50);
			BasicStroke stroke=new BasicStroke(10);
			g2.setStroke(stroke);
			g2.clearRect(0,0,338,220);
			if(flag==0){
				g2.draw(rect);
			}else if(flag==1){
				g2.rotate(rotateValue);
				g2.draw(rect);
			}else{
				g2.rotate(rotateValue);
				g2.draw(rect);
			}
		}
	}
}


6.绘制艺术图案

使用随机生成的颜色 绘制由椭圆形构成的图案

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.util.Random;

public class ArtDesign extends JFrame{
	ArtDesignPanel adp=new ArtDesignPanel();
	
	public static void main(String args[]){
		ArtDesign jf=new ArtDesign();
		jf.setVisible(true);
	}
	
	public ArtDesign(){
		super();
		setTitle("绘制艺术图案");
		setBounds(100,100,438,320);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		add(adp);
	}
	
	class ArtDesignPanel extends JPanel{
		public void paint(Graphics g){
			Graphics2D g2=(Graphics2D)g;
			Ellipse2D.Float ellipse=new Ellipse2D.Float(-80,30,160,10);
			Random random=new Random();
			g2.translate(160, 90);
			int R=random.nextInt(256);
			int G=random.nextInt(256);
			int B=random.nextInt(256);//随机生成RGB三个颜色的值
			Color color=new Color(R,G,B);
			g2.setColor(color);
			g2.draw(ellipse);
			for(int i=0;i<100;i++){
				R=random.nextInt(256);
				G=random.nextInt(256);
				B=random.nextInt(256);
				color=new Color(R,G,B);
				g2.setColor(color);
				g2.rotate(10);
				g2.draw(ellipse);
			}
		}
	}
}


 

7.缩放图案

加载一张图片 使用滑块来控制图案的缩放

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import java.awt.*;
import java.net.*;

public class ZoomImageFrame extends JFrame{
	Image img=null;//声明土现象对象
	ZoomImagePanel imagePanel=new ZoomImagePanel();
	int height,width;
	int nheight,nwidth;//图像缩放之后的高度宽度
	JSlider slider=new JSlider();//滑块对象
	
	public static void main(String args[]){
		ZoomImageFrame jf=new ZoomImageFrame();
		jf.setVisible(true);
	}
	
	public ZoomImageFrame(){
		super();
		setTitle("缩放图像");
		URL imgUrl=ZoomImageFrame.class.getResource("/img/img.jpg");//img要放在bin文件夹中
		img=Toolkit.getDefaultToolkit().getImage(imgUrl);
		add(imagePanel);
		setBounds(200,160,355,253);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		slider.addChangeListener(new ChangeListener(){
			@Override
			public void stateChanged(ChangeEvent e) {
				// TODO Auto-generated method stub
					imagePanel.repaint();
				}
			});
		this.getContentPane().add(slider,BorderLayout.SOUTH);
	}
	
	class ZoomImagePanel extends JPanel{
		public void paint(Graphics g){
			g.clearRect(0, 0, this.getWidth(), this.getHeight());
			width=img.getWidth(this);
			height=img.getHeight(this);
			float value=slider.getValue();//滑块组件的取值
			nwidth=(int)(width*value/100);
			nheight=(int)(height*value/100);
			g.drawImage(img, 0, 0, nwidth, nheight, this);
		}
	}
}


8.裁剪图片

对一个图片进行截图  按ESC键退出时 可保存当前所截图片内容

//import javax.print.DocFlavor.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileSystemView;

import java.io.File;
import java.util.Date;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.*;
import java.text.SimpleDateFormat;

public class CutImageFrame extends JFrame{
	Image img=null;
	OldImagePanel oldimage=new OldImagePanel();
	CutImagePanel cutimage=new CutImagePanel();
	int pressPanelX=0, pressPanelY=0;
	int pressX=0, pressY=0;//鼠标按下点的x y坐标
	int releaseX=0, releaseY=0;//鼠标释放点的x y坐标
	Robot robot=null;
	BufferedImage buffImage=null;//声明缓冲图像对象
	boolean flag=false;
	
	public static void main(String args[]){
		CutImageFrame jf=new CutImageFrame();
		jf.setVisible(true);
	}
	
	public CutImageFrame(){
		super();
		setTitle("裁剪图片");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		URL imgUrl=CutImageFrame.class.getResource("/img/img.jpg");
		img=Toolkit.getDefaultToolkit().getImage(imgUrl);
		setBounds(200,160,360,280);
		JSplitPane splitPane=new JSplitPane();//分割容器类
		splitPane.setDividerLocation((this.getWidth()/2)-10);
		this.getContentPane().add(splitPane,BorderLayout.CENTER);
		splitPane.setLeftComponent(oldimage);
		splitPane.setRightComponent(cutimage);
		
		oldimage.addMouseListener(new MouseAdapter(){
			public void mousePressed(MouseEvent e){//鼠标按下事件
				pressPanelX=e.getX();
				pressPanelY=e.getY();
				pressX=e.getXOnScreen()+1;
				pressY=e.getYOnScreen()+1;
				flag=true;
			}
			public void mouseReleased(MouseEvent e){
				releaseX=e.getXOnScreen()-1;
				releaseY=e.getYOnScreen()-1;
				try{
					robot=new Robot();
					if(releaseX-pressX>0&&releaseY-pressY>0){
						Rectangle rect=new Rectangle(pressX,pressY,releaseX-pressX,releaseY-pressY);
						buffImage=robot.createScreenCapture(rect);
						cutimage.repaint();
					}
				}catch(AWTException e1){
					e1.printStackTrace();
				}
				flag=false;
			}
		});
		oldimage.addMouseMotionListener(new MouseMotionAdapter(){//鼠标移动事件
			public void mouseDragged(MouseEvent e){
				if(flag){
					releaseX=e.getXOnScreen();
					releaseY=e.getYOnScreen();
					oldimage.repaint();
				}
			}
		});
		
		this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                // 按Esc键退出
                if (e.getKeyCode() == 27) {
                    saveToFile();
                    System.exit(0);
                }
            }
        });
	}
	
	class OldImagePanel extends JPanel{
		public void paint(Graphics g){
			Graphics2D g2=(Graphics2D)g;
			g2.drawImage(img,0,0,this.getWidth(),this.getHeight(),this);
			g2.setColor(Color.white);
			if(flag){
				float[] arr={5.0f};//创建虚线模式的数组
				BasicStroke stroke=new BasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,1.0f,arr,0);
				g2.setStroke(stroke);
				g2.drawRect(pressPanelX, pressPanelY, releaseX-pressX, releaseY-pressY);
			}
		}
	}
	
	class CutImagePanel extends JPanel{
		public void paint(Graphics g){
			g.clearRect(0,0,this.getWidth(),this.getHeight());
			g.drawImage(buffImage, 0, 0, releaseX-pressX, releaseY-pressY, this);
		}
	}
	public void saveToFile() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");
        String name = sdf.format(new Date());
        File path = FileSystemView.getFileSystemView().getHomeDirectory();
        String format = "jpg";
        File f = new File(path + File.separator + name + "." + format);
        System.out.println(path + File.separator + name + "." + format);
        try {
            ImageIO.write(buffImage, format, f);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}




   

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011699990/article/details/52373046

智能推荐

帆软报表——多源分片与冻结_qq_36950604的博客-程序员秘密_帆软冻结列

最终效果图如下:需要实现的效果:多列多源,不进行分页显示。数据来自地区、供应商、雇员三个数据源。 列冻结,行冻结其实,我最想总结的还是数据绑定,以及显示。我总感觉有点迷!数据表:类别表、产品表、订单表、订单明细表、供应商表三个数据源sql语句:ds1: 类别、产品id、产品名称、产品对应供应商IDds2:雇员ID、货主地区、产品ID、该订单明细对应的金额 (可按照雇员、地区进行分类展示)ds3: 产品ID、该产品在该项订单明细中对应的金额、产品对应供应...

解决问题: terminate called after throwing an instance of 'std::runtime_error' what(): locale::facet::_RottenRose的博客-程序员秘密

问题:   ubuntu 跑matlab的时候报错:   terminate called after throwing an instance of 'std::runtime_error'  what():  locale::facet::_S_create_c_locale name not valid解决方法:1.   export LC_ALL=C --->对

Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航_bill_live的博客-程序员秘密

在Win10之前,WP平台的App主要有枢轴和全景两种导航模式,我个人更喜欢Pivot即枢轴模式,可以左右切换,非常方便。全景视图因为对设计要求比较高,自己总是做不出好的效果。对于一般的新闻阅读类App来说,Pivot更适合多个频道的展示,因为内容基本都是一样的。到了Win10,微软模仿其他平台也推出了汉堡菜单,但并没有提供现成的控件,而是需要开发者通过一个名为SplitView的控件来实现。...

create-react-app中使用CodeMirror轻量级代码编辑器,实现自动提示,自动补全代码问题___1234的博客-程序员秘密_codemirror 自动补全

构建create-react-app,这里忽略······安装 代码编辑器 CodeMirror 的轻量级 React 组件npm install @uiw/react-codemirror --save安装好了之后,就可以直接引入使用了,直接上代码:import CodeMirror from '@uiw/react-codemirror';import 'codemi...

k/3cloud表格控件块粘贴代码逻辑_范永强的博客-程序员秘密

有些问题BOS不太好处理,例如用户希望枚举全部按名称检索赋值,这个和BOS这边的通用逻辑有冲突。因此将块粘贴代码逻辑贴出来给到大家,大家可以在表单插件EntityBlockPasting事件中自己处理,然后将cancel设置为true。以下代码用户可以参考一下,插件代码中需要将其中一些属性或方法修改,例如this.BusinessInfo替换为this.View.BusinessInfo,Upda

随便推点

C / C++中的零(0)_kaffeel的博客-程序员秘密

零(0)是一个整数。由于各种标准转换,0可以被用于表示任意整数(布尔量:bool,字符型:char,整型数:int)、浮点类型、指针、还有指向成员的指针的量。0的类型将由上下文确定。 由于没有任何对象会被分配到地址0,因此,0也被当做一个指针常量,表明一个指针当时并没有指向任何对象。在C语言中非常流行的就是用NULL宏表示0指针。由于C++收紧的类型检查规则,采用普通的0表示空指针比NULL更好一些。如果你习惯了使用NULL来表示0指针,那么最好采用如下定义: const    int NULL = 0

个推集成步骤_qq_34024778的博客-程序员秘密

1.注册账号2.创建应用,填写相关信息获取3.集成添加依赖在项⽬根⽬录 build.gradle ⽂件的 allprojects.repositories 块中,添加个推 maven 库地址 maven { url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"}在 app/build.gradle ⽂件中的 android.defaultConfig 下指定所需的 CPU 架构,如下所示: .

win10备份为wim_电脑:Win10 专业版提取制作方法_weixin_39687881的博客-程序员秘密

准备工作:➤ 制作环境:Win10 操作系统➤ 使用工具:DISM( 系统自带 )、UltraISO 软碟通

Qwt源码解读之QwtPoint3D类_e5Max的博客-程序员秘密

QwtPoint3D 表征二维坐标系中的一个三维点(x, y, z)。代码分析:1、类接口定义:class QWT_EXPORT QwtPoint3D{public: QwtPoint3D(); // 默认构造函数 QwtPoint3D( double x, double y, double z ); // 三个参数的构造函数 QwtPoint3D(

pythonexe系统错误丢失_pythonw.exe应用程序错误_weixin_39610188的博客-程序员秘密

第一次安装python,出师不利,就遇到这么个错误。多方百度无果,在自己“辛勤”努力下,终于安装成功。1、首先介绍一下系统,Windows8.1 企业版 64位,安装python3.6.5 release版,32位、64位都进行了测试。安装64位时显示的是上图,安装32位时提示api-ms-win-crt-runtime-l1-1-0.dll,但是后来不知道怎么也提示上图了。2、然后就开始巴啦啦的...