JAVA 画图板实现(基本画图功能+界面UI)一、界面实现

/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 [email protected]*/

这段时间在学JAVA的swing界面开发,试着做了个画图板。实现了直线、曲线、喷枪、矩形、圆形、文字、橡皮等操作,感觉收获很大。

既然要做画图板,那最好的参考当然是windows系统自带的画图啦!虽然技术有限不能做的一模一样,但感觉还是能看(手动滑稽)。下面就讲讲如何实现了。

首先不用想,肯定是先把界面做好了(这是我做的界面,emmmmmm。。。。功能和界面都还有待完善)

仔细看一看大概就能想到怎么实现了,首先创建一个DrawMain类继承(extends)JFrame类

public class DrawMain extends JFrame {

	public static void main(String[] args) {
		DrawMain dm = new DrawMain();
		dm.setLookAndFeel();
		dm.initUI();
	}

	/**
	 * 为主面板设置皮肤,这个是我随便找的一个,具体可以自己去研究
	 */

	public void setLookAndFeel() {

		try {

			UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

		} catch (Exception e) {

			e.printStackTrace();

		}

	}

	public void initUI() {
		this.setTitle("画图程序");
		this.setSize(1000, 700);
		this.setDefaultCloseOperation(3);
		this.setLocationRelativeTo(null);
		this.setLayout(new BorderLayout());
	     this.setVisible(true);

}

  这当然只是主界面啦,那后面该怎么弄呢?上面可以有那么多个分区当然需要再放几个容器类型的组件啦。就是组件里放组件了,那么此时布局的选择很重要,首先利用主界面是BroderLayout,就在北方向上放上一个JPanel上去咯

		JPanel NorthJPanel = new JPanel();
		NorthJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 0));
		NorthJPanel.setBackground(new Color(240, 240, 240));//设置背景色          //NorthJPanel.setBorder(BorderFactory.createEtchedBorder(new Color(0, 0, 0), new Color(0, 255, 0)));设置边框,可以看看有什么区别
		this.add(NorthJPanel, BorderLayout.NORTH);

  运行一下,再拉拉边框,有什么发现没有?这个刚贴上去的组件大小会随着你拉边框而改变,所以我们应该再贴一个JPanel到这个JPanel里,然后再设置好大小防止改变

		JPanel InNorthJPanel = new JPanel();
		InNorthJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 0));
		InNorthJPanel.setPreferredSize(new Dimension(900, 150));
		InNorthJPanel.setBackground(new Color(240, 240, 240));
		NorthJPanel.add(InNorthJPanel);

  然后该怎么做呢?设置分区,自然,每个分区就是一个JPanel组件

/*
		 * 形状区域
		 *
		 * @param ShapeJPanel 形状区域的面板,界面布局
		 *
		 * @param InShapeJPanel 形状区域中放置形状选项的面板,放在ShapeJPanel中,流式布局
		 *
		 * @param InShapeLabel 形状区域中标识区域的标签,放在ShapeJPanel中
		 */
		JPanel ShapeJPanel = null;
		ShapeJPanel = createJPanel(InNorthJPanel);
		ShapeJPanel.setPreferredSize(new Dimension(300, 150));
		JPanel InShapeJPanel = new JPanel();
		InShapeJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
		InShapeJPanel.setBackground(null);// 设置背景色透明
		InShapeJPanel.setOpaque(false);
		InShapeJPanel.setPreferredSize(new Dimension(300, 110));
		ShapeJPanel.add(InShapeJPanel, BorderLayout.NORTH);
		JLabel InShapeLabel = null;
		InShapeLabel = createJLabel("形状", ShapeJPanel);

		/*
		 * 颜色区域
		 *
		 * @param ColorJPanel 颜色区域面板,界面布局
		 *
		 * @param InColorJPanel 颜色区域中放置颜色选项的面板,放在ColorJPanel中,流式布局
		 *
		 * @param InColorLabel 颜色区域中标识区域的标签,放在ColorJPanel中
		 */
		JPanel ColorJPanel = null;
		ColorJPanel = createJPanel(InNorthJPanel);
		JPanel IncolorJPanel = new JPanel();
		IncolorJPanel.setPreferredSize(new Dimension(200, 110));
		IncolorJPanel.setBackground(null);// 设置背景色透明
		IncolorJPanel.setOpaque(false);
		IncolorJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
		ColorJPanel.add(IncolorJPanel, BorderLayout.NORTH);
		JLabel InColorLabel = null;
		InColorLabel = createJLabel("颜色", ColorJPanel);

		/*
		 * 粗细设置区域
		 *
		 * @param StrokeJPanel 粗细设置区域面板,界面布局
		 *
		 * @param InStrokeJPanel 粗细设置区域中放置粗细选项的面板,放在StrokeJPanel中,流式布局
		 *
		 * @param InStrokeLabel 粗细设置区域的标签,放在StrokeJPanel中
		 */
		JPanel StrokeJPanel = null;
		StrokeJPanel = createJPanel(InNorthJPanel);
		StrokeJPanel.setPreferredSize(new Dimension(50, 150));
		JPanel InStrokeJPanel = new JPanel();
		InStrokeJPanel.setPreferredSize(new Dimension(50, 110));
		InStrokeJPanel.setBackground(null);
		InStrokeJPanel.setOpaque(false);
		InStrokeJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
		StrokeJPanel.add(InStrokeJPanel, BorderLayout.NORTH);
		JLabel InStrokeLabel = null;
		InStrokeLabel = createJLabel("粗细", StrokeJPanel);

  可能你会发现,我在里面用了createJLabel()和createJPanel(),这是我写的方法,因为在创建过程中很多代码是重复的,自己写两个方法用在里面代码看上去会舒服很多,而且也能少写很多代码。两个方法的具体实现

     private JPanel createJPanel(JPanel InNorthJPanel) {
		JPanel jp = new JPanel();
		jp.setBorder(BorderFactory.createEtchedBorder(new Color(0, 0, 0), new Color(0, 255, 0)));
		jp.setPreferredSize(new Dimension(200, 150));
		jp.setBackground(new Color(240, 240, 240));
		InNorthJPanel.add(jp);
		return jp;
	}

	private JLabel createJLabel(String s, JPanel jp) {
		JLabel jl = new JLabel(s);
		jl.setHorizontalAlignment(JLabel.CENTER);// 设置对其格式剧中
		jl.setFont(new Font("楷体", Font.BOLD, 20));// 设置字体 样式 大小
		jp.add(jl, BorderLayout.SOUTH);
		return jl;
	}

  这样上面的边框就做好了,接下来就是贴按钮和文本框之类的了

          /*
		 * 放置按钮
		 */
		String[] typeArray = { "Line", "Oval", "Rect", "RoundRect", "fill3DRect", "fillArc", "Image", "Text", "Pencil",
				"iso_Tri", "Polygon","喷枪", "Erase" };
		Color[] colorArray = { Color.red, Color.black, Color.green, Color.BLUE, new Color(255, 255, 255) };
		String[] widthArray = { "1", "3", "5" };
		JTextField text = new JTextField();
		text.setPreferredSize(new Dimension(100, 30));

		DrawListener dl = new DrawListener(this, text, list);

		for (int i = 0; i < typeArray.length; i++) {
			JButton button = new JButton(typeArray[i]);
			InShapeJPanel.add(button);
			button.addActionListener(dl);
			if(i>=12)
			{
				JButton button1 = new JButton(typeArray[i]);
				InNorthJPanel.add(button);
				button1.addActionListener(dl);
			}
		}
		for (int i = 0; i < colorArray.length; i++) {
			JButton button = new JButton();
			button.setBackground(colorArray[i]);
			button.setPreferredSize(new Dimension(30, 30));
			IncolorJPanel.add(button);
			button.addActionListener(dl);
		}
		for (int i = 0; i < widthArray.length; i++) {
			JButton button = new JButton(widthArray[i]);
			InStrokeJPanel.add(button);
			button.addActionListener(dl);
		}
		InNorthJPanel.add(text);

  这样,我们的界面就做好了。

原文地址:https://www.cnblogs.com/csu-lmw/p/9285065.html

时间: 2024-10-14 00:29:31

JAVA 画图板实现(基本画图功能+界面UI)一、界面实现的相关文章

很值得学习的java 画图板源码

很值得学习的java 画图板源码下载地址:http://download.csdn.net/source/2371150 package minidrawpad; import java.awt.*; import java.awt.event.*; import java.io.InputStreamReader; import java.io.Reader; import javax.swing.*; // 主界面类 public class DrawPad extends JFrame i

画图板中的画图工具的使用

重绘指的是,将画出来的图形进行保存,重绘分为三种:记坐标,记点,记步骤. 我们在此主要讲习记坐标的方法: 如果我们想要画出一个直线,最主要的是要记录它的两个坐标,所以我们应该建立一个数组来记录,这两个坐标. 代码如下: public class Shape { int x1,y1,x2,y2; String name; Color color; public Shape(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; t

JAVA 仿XP画图板的总结

仿XP画图板是我接触JAVA以来的第二个项目.总得来说是比较成功的,不足是还有一些功能没有实现,之后有时间会慢慢完善. 话不多说,先上成果图(源码在最下面会附上链接): 可以看到,做的画图板已经实现了直线,矩形,椭圆,圆角矩形,多边形,刷子,喷漆,橡皮等基本功能,28种颜色可供选择.上方的菜单栏功能还没有开发~~ 如何做到这一个画图板呢?接下来是我画图板的制作过程: 1 . 画图板界面框架 我将整个框架分为五个部位,主界面面板,菜单栏部位,画图板面板,工具栏面板,颜色选择面板: 主界面:先实例化

Java版简易画图板的实现

Windows的画图板相信很多人都用过,这次我们就来讲讲Java版本的简易画板的实现. 基本的思路是这样的:画板实现大致分三部分:一是画板界面的实现,二是画板的监听以及画图的实现,三是画板的重绘.(文章较长,但是代码是逐步递进的,可以按三部分分开来看,实现了当前部分再去看下一部分.)首先是画板的界面实现,因为我没有去找具体的图标,界面上的所有组件都是Swing的自带组件,所以界面略微有点简陋,不过如果想要优化也简单,把界面上的组件都改成自定义的图标即可.界面实现后,就可以考虑给界面的组件加上监听

Android笔记二十九. 一款简易画图板开发

一款简易画图板开发 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.画图板原理 1.直线效果 画图板表面上看起来可以随用户在触摸屏上自由的绘制任意图形,但是实际上当用户在触摸屏上移动时,两次拖动事件发生点的距离很小,多条极短的直线连接起来我们肉眼看起来就是直接了.在触摸屏绘制图形时,每条直线都是从上一次拖动事件发生点画到本次拖动事件的发生点,可以借助于Android提供的Path类来实现.然后,如果程序每次都是从上次拖动事件的发生点绘一条

iOS开发之画图板(贝塞尔曲线)

贝塞尔曲线,听着挺牛气一词,不过下面我们在做画图板的时候就用到贝塞尔绘直线,没用到绘制曲线的功能.如果会点PS的小伙伴会对贝塞尔曲线有更直观的理解.这篇博文的重点不在于如何用使用贝塞尔曲线,而是利用贝塞尔划线的功能来封装一个画图板. 画图板的截图如下,上面的白板就是我们的画图板,是自己封装好的一个UIView,下面会详细的介绍如何封装这个画图板,下面的控件用来控制我们画图板的属性以及Undo,Redo和保存功能.点击保存时会把绘制的图片保存到手机的相册中.下面是具体的实现方案. 一.封装画图板

Swift-贝赛尔曲线实现画图板 &amp;&amp; 截图保存到相册中

本文内容参考自 传送门.原文是用 OC 写的,我把它改成了 Swift 的. 我们先来看看效果图: 第一幅图是我们画了一个 "iOS" 的图像,第二幅图是我们点击保存成功,第三幅图是可以在相册中看到我们刚才画的图. 感觉很不错有木有?接下来我们就来说说是怎么实现的. 我们分两部分来说:上半部分的画图板和下半部分的控制区. 上半部分的画图板是我们自定义的 view,我们设置如下属性: class MyView: UIView { var color = UIColor.redColor(

H TML5 之 (5) 一个在线画图板

这里加入了点难度了,增加了对HTML很多时间的把握,对象的把握 index.html <!DOCTYPE HTML> <html> <head> <title>Paint</title> <meta charset="gbk" /> <link type="text/css" href="canvas.css" rel="stylesheet"/&g

EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) EO理论上是只有产品组维护,里面包含其所有的业务逻辑,并提供相应的Expert给自己或者其它产品组使用.而VO是各个组根据需要或基于EO或者只读的SQL而建立的,里面可以根据需要添加自己的业务实现和逻辑. 对于EO内部的验证功能,在开发文档中主要介绍了三种: 1. 在setter里面实现单个属性的验证.这主要是对于没有依赖关系的属性,也就是说它的验证不需要其它会被修改的属性的支持.比如,验证