精华内容
下载资源
问答
  • Python实现画图软件功能,windows的画图功能不能实现概述虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述...

    Python实现画图软件功能,windows的画图功能不能实现

    概述

    虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述Python在GUI(图形用户界面)方面的应用,仅供学习分享使用,如有不足之处,还请指正。

    设计思路

    页面布局:主要分为上下两部分 a. 绘图区域,本例以Canvas实现 b. 下部:功能区,由按钮实现

    事件监听:通过给功能按钮绑定事件,来实现不同的功能,如:绘线,绘矩形等功能。

    绘图区域:监听鼠标左键的按下(开始绘图)和抬起(停止绘图),再根据不同的按钮实现绘制不同的图形。

    涉及知识点

    开发工具:Python3.7 , PyCharm2019

    Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

    Canvas控件提供了一个自定义的绘图区域,可以通过不同的函数来绘制不同的图形。

    绘制直线 create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)

    绘制带箭头的直线 create_line(self.x, self.y, event.x, event.y, arrow=LAST, fill=self.fgcolor)

    绘制矩形 create_rectangle(self.x, self.y, event.x, event.y, outline=self.fgcolor)

    绘制曲线,是通过绘制不同的点来实现的

    清除图形 drawpad.delete('all')

    Button 按钮控件,通过绑定(bind)不同的监听事件来实现不同的功能。

    name属性设置按钮的名称,

    text属性设置按钮的显示文本。

    bind 绑定事件

    示例效果图

    本例主要实现绘制直线,带箭头的直线,曲线,矩形,清除等功能,如下所示:

    核心代码

    在本例中,主要功能如下:

    创建画板

    1 """创建画图区域"""

    2 self.drawpad = Canvas(self, width=win_width, height=win_height, bg=bgcolor)3 self.drawpad.pack()

    View Code

    创建按钮

    1 #创建按钮

    2 self.btn_start = Button(self, name='start', text='开始')3 self.btn_start.pack(side='left', padx=10)4 self.btn_pen = Button(self, name='pen', text='画笔')5 self.btn_pen.pack(side='left', padx=10)6 self.btn_rect = Button(self, name='rect', text='矩形')7 self.btn_rect.pack(side='left', padx=10)8 self.btn_clear = Button(self, name='clear', text='清屏')9 self.btn_clear.pack(side='left', padx=10)10 self.btn_erasor = Button(self, name='erasor', text='橡皮擦')11 self.btn_erasor.pack(side='left', padx=10)12 self.btn_line = Button(self, name='line', text='直线')13 self.btn_line.pack(side='left', padx=10)14 self.btn_line_arrow = Button(self, name='line_arrow', text='箭头直线')15 self.btn_line_arrow.pack(side='left', padx=10)16 self.btn_color = Button(self, name='color', text='颜色')17 self.btn_color.pack(side='left', padx=10)

    View Code

    绑定事件

    1 #绑定事件

    2 self.btn_line.bind('', self.eventManager) #点击按钮事件

    3 self.btn_line_arrow.bind('', self.eventManager) #点击按钮事件

    4 self.btn_rect.bind('', self.eventManager) #点击按钮事件

    5 self.btn_pen.bind('', self.eventManager) #点击按钮事件

    6 self.btn_erasor.bind('', self.eventManager) #点击按钮事件

    7 self.btn_clear.bind('', self.eventManager) #点击按钮事件

    8 self.btn_color.bind('', self.eventManager) #点击按钮事件

    View Code

    功能实现

    1 defeventManager(self, event):2 name =event.widget.winfo_name()3 print(name)4 self.start_flag =True5 if name == 'line':6 #左键拖动

    7 self.drawpad.bind('', self.myline)8 elif name == 'line_arrow':9 self.drawpad.bind('', self.myline_arrow)10 elif name == 'rect':11 self.drawpad.bind('', self.myrect)12 elif name == 'pen':13 self.drawpad.bind('', self.mypen)14 elif name == 'erasor':15 self.drawpad.bind('', self.myerasor)16 elif name == 'clear':17 self.drawpad.delete('all')18 elif name == 'color':19 c = askcolor(color=self.fgcolor, title='请选择颜色')20 print(c) #c的值 ((128.5, 255.99609375, 0.0), '#80ff00')

    21 self.fgcolor = c[1]22

    23 defstartDraw(self, event):24 self.drawpad.delete(self.lastdraw)25 ifself.start_flag:26 self.start_flag =False27 self.x =event.x28 self.y =event.y29

    30 defstopDraw(self, event):31 self.start_flag =True32 self.lastdraw =033

    34 defmyline(self, event):35 self.startDraw(event)36 self.lastdraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)37

    38 defmyline_arrow(self, event):39 self.startDraw(event)40 self.lastdraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, arrow=LAST, fill=self.fgcolor)41

    42 defmyrect(self, event):43 self.startDraw(event)44 self.lastdraw = self.drawpad.create_rectangle(self.x, self.y, event.x, event.y, outline=self.fgcolor)45

    46 defmypen(self, event):47 self.startDraw(event)48 print('self.x=', self.x, ',self.y=', self.y)49 self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)50 self.x =event.x51 self.y =event.y52

    53 defmyerasor(self, event):54 self.startDraw(event)55 print('self.x=', self.x, ',self.y=', self.y)56 self.drawpad.create_rectangle(event.x - 3, event.y - 3, event.x + 3, event.y + 3, fill=bgcolor)57 self.x =event.x58 self.y = event.y

    View Code

    快捷键的实现

    1 self.master.bind('', self.hotKey) #绑定快捷键

    2 self.master.bind('', self.hotKey) #绑定快捷键

    3 self.master.bind('', self.hotKey) #绑定快捷键

    4 self.master.bind('', self.hotKey) #绑定快捷键

    5 self.drawpad.bind('', self.stopDraw) #左键释放按钮

    View Code

    快捷键功能实现

    1 defhotKey(self, event):2 c =event.char3 if c == 'r':4 self.fgcolor = 'red'

    5 elif c == 'g':6 self.fgcolor = 'green'

    7 elif c == 'b':8 self.fgcolor = 'blue'

    9 elif c == 'y':10 self.fgcolor = 'yellow'

    View Code

    有需要的朋友,可点击链接下载整体代码,如下所示:

    源码链接

    备注

    不积跬步,无以至千里;不积小流,无以成江海;锲而舍之,朽木不折,锲而不舍,金石可镂。

    展开全文
  • /*文章中用到的代码只是一部分,...既然要做画图板,那最好的参考当然是windows系统自带的画图啦!虽然技术有限不能做的一模一样,但感觉还是能看(手动滑稽)。下面就讲讲如何实现了。首先不用想,肯定是先把界面做...

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/

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

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

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

    61ffe62ac77a9ebdb107cb48187ebd17.png

    仔细看一看大概就能想到怎么实现了,首先创建一个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);

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

    展开全文
  • 这段时间在学JAVA的swing界面开发,试着做...既然要做画图板,那最好的参考当然是windows系统自带的画图啦!虽然技术有限不能做的一模一样,但感觉还是能看(手动滑稽)。下面就讲讲如何实现了。 首先不用想,肯定...

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/

    这段时间在学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

    展开全文
  • /*文章中用到的代码只是一部分,...既然要做画图板,那最好的参考当然是windows系统自带的画图啦!虽然技术有限不能做的一模一样,但感觉还是能看(手动滑稽)。下面就讲讲如何实现了。首先不用想,肯定是先把界面做...

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

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

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

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

    20180709181818980023.png

    仔细看一看大概就能想到怎么实现了,首先创建一个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);

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

    展开全文
  • 就是做的和Windows自带的画图功能的写字的一个小功能,谢谢大家了 !![图片说明](https://img-ask.csdn.net/upload/201501/30/1422578970_773421.jpg)
  • 最近正在做一个与Windows自带的画图软件mspaint类似的画图软件,基本界面上的工具箱和颜料盒已经设计完毕。但是图像绘制功能还没有实现,也在寻求设计方法...目前有两种思路:1.设计成mspaint的形式,简单的绘图功能2....
  • 打算使用一个UI工具做一个画板工具(类似于window自带的画图工具),实现以下2个功能: 1、画笔工具,使用画笔工具可以画出任意曲线。(这一条会做,关键是第二条) 2、橡皮擦工具,使用橡皮擦工具可以擦除已经画...
  • bug windows10环境默认保存在桌面并且不能修改名字 代码 等我晚上完善了把github上连接放上,不会用git伙计们可以自己百度,英文好自己看github教程 私活 常用git 命令就8、9个,看看廖雪峰老师掌握...
  • 我只是实现了其中的部分功能,如画直线、画圆、画矩形、曲线这几种,实现了图片的保存与打开,但这个过程只能在自己的画图板中才能查看,而不能用已有的软件来打开。现在我正向把图片保存成bmp格式努力,这样查看...
  • 一个windows自带的画图工具是无论如何也不能满足我们的画图需要的,很多效果都需要我们在另外的工具中来实现。这些高级的功能是如何实现的呢,如何操纵一些基本的属性和函数,让它们最终能作出我们想要的效果呢?...
  • 因 此在赋值后应该及时销毁或者初始化 L2,以免发生可预见错误。 比较 使用 Contains 方法。 ArrayList Array1=new ArrayList(); Array1.Add("as"); bool b1=Array1.Contains("as"); MessageBox.Show(b1....
  • 本文是基于VS2008的Windows底层基础代码1. 帮助初学者了解windows应用程序...在创建文件夹时需选择win32应用程序,不能选择MFC应用程序。 序号 底层窗口实现具体步骤 Ⅰ WinMain入口函数 Ⅱ 创建窗口五步法
  • Windows操作系统自带的画图软件就有调节图片分辨率的功能,但画图软件并不能实现图片的批量操作,比较费时费力。有一款简单的小软件,只需四步就可以实现批量设置图片的分辨率和图片的大小。JPEG Resizer大...
  • 随鼠标移动画线

    千次阅读 2012-04-13 21:58:16
    要求能实现基本自由手绘曲线功能,其他方面 做要求。 这个做很简单。只是实现鼠标自由画线。没有保存,打印,画椭圆什么的功能。 实现过程如下: 在visual C++6.0里面 文件->新建->工程里面MFC Appwizard...
  • 点击上方“Qt学视觉”,选择“星标”公众号...这种方法如同使用Windows的画图软件在绘图,绘制的图形是位图,这种方法适合于绘制复杂性不高的固定图形,不能实现图件的选择、编辑、拖放、修改等功能 Qt为绘制复杂...
  • 这种方法如同使用 Windows 的画图软件在绘图,绘制的图形是位图,这种方法适合于绘制复杂性不高的固定图形,不能实现图件的选择、编辑、拖放、修改等功能。 Qt为绘制复杂的可交互图形提供了 Graphics view 绘图架构...
  • 工具是无论如何也不能满足我们的画图需要的,很多效果都需要我们在另外的/tool/"&gt;工具中来实现。这些高级的功能是如何实现的呢,如何操纵一些基本的属性和函数,让它们最终能作出我们想要的效果呢?这里...
  • MFC的CDC类封装了Windows API 中大部分的画图函数。CDC的常见操作函数包括: Drawing-Attribute Functions:绘图属性操作,如:设置透明模式 Mapping Functions:映射操作 Coordinate Functions:坐标操作 ...
  • 本教程并想让你完全了解这种语言,只是使你尽快加入开发动态web站点行列。我假定你有一些HTML(或者HTML编辑器)基本知识和一些编程思想。 1.简介 PHP是让你生成动态网页工具之一。PHP网页文件被当作...
  • 其中,注释可以写入文件中,但不能与即将要读取数据在同一行。 3. 代码例子: // 读取 CFG 文件中所有敌机名称 // 读取完后m_sEnimyName中字符串是每个section name连接,两两之间用”\0”字符分开,如: //...
  • 游戏进阶之千里之行始于足下(一)

    千次阅读 2006-07-26 21:53:00
    GDI 汇编: Windows是一个基于图形操作... 不幸是,GDI在有些时候不能满足你性能上要求,特别是游戏,对于图形功能要求是很高,同时对于速度要求也是很苛刻,这就是DrectX出现原因。我们首先来学习一
  • 多媒体教室

    2013-06-14 08:10:31
    图形按钮区按钮为亮黑色时表示此功能可以使用,为灰色时表示此功能不能使用,为凹下状态表示该功能正在执行。当按下某按钮执行某一功能后,再按 Break 键使这一正在执行功能停止执行。可以使用系统设置下热键设置...
  • 会计理论考试题

    2012-03-07 21:04:40
    7.在Windows98刚启动时任务栏上显示是___C___。 A、“开始”按钮 B、输入法提示 C、“我电脑”图标 D、时钟显示 8.在Windows98中,图标可以代表___D____。 A、程序 B、文件 C、文件夹 D、打印机信息 9....
  • 电力行业另一个特点是它产品不能储存,发电量超过需要量会形成浪费,发电量不足,会影响生产和生活需要。而且,社会对电量需要是一个不定量,它会随着地区、时间、季节、气候、人们生活等方面变化而变化。...
  • 如同系统BIOS快取功能,启用影像BIOS快取功能将允许存取影像BIOS自C0000H到C7FFFH具有快取功能,如果快取控制器也被启用。高速缓存大小愈大,影像效能将会更快速。 Memory Hole At 15M-16M(扩展卡内存分配...
  • Foxit Reader(福昕阅读器)破解版

    热门讨论 2012-02-02 16:18:48
     改进权限控制: 福昕阅读器在受保护PDF文件中,用户无相关操作权限时,一些相关工具将显示灰色,不能使用。  改进更新模式:  全新更新模式,允许用户在更新对话框中自由选择更新内容,还可以通过...
  • 【自动填充】 不同于EXCELCTRL+D功能对选中某列数据不同存储格区域空白处,取相邻上一为空存储格内容同时作数据源自动填充。1分钟内能处理手工需几小时才能完成几万行ERP或KingDee原始数据。...
  • cool(7KB) 677,registry.zip 读和写注册表文件例子(7KB) 678,xcopy.zip 模仿dos命令xcopy的功能(3KB) 679,winpaths.zip 得到计算机上windows目录和系统目录(3KB) 680,tray.zip 实现托盘...
  • cool(7KB) 677,registry.zip 读和写注册表文件例子(7KB) 678,xcopy.zip 模仿dos命令xcopy的功能(3KB) 679,winpaths.zip 得到计算机上windows目录和系统目录(3KB) 680,tray.zip 实现托盘...
  • cool(7KB) 677,registry.zip 读和写注册表文件例子(7KB) 678,xcopy.zip 模仿dos命令xcopy的功能(3KB) 679,winpaths.zip 得到计算机上windows目录和系统目录(3KB) 680,tray.zip 实现托盘...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

windows的画图功能不能实现