Java GUI中的paint方法疑难解析
Java的Graphics类进行绘图的方法详解
Java的Graphics类进⾏绘图的⽅法详解Graphics类提供基本绘图⽅法,Graphics2D类提供更强⼤的绘图能⼒。
Graphics类提供基本的⼏何图形绘制⽅法,主要有:画线段、画矩形、画圆、画带颜⾊的图形、画椭圆、画圆弧、画多边形等。
1. 画线在窗⼝画⼀条线段,可以使⽤Graphics类的drawLine()⽅法:drawLine(int x1,int y1,int x2,int y2) 例如,以下代码在点(3,3)与点(50,50)之间画线段,在点(100,100)处画⼀个点。
g.drawLine(3,3,50,50);//画⼀条线段g.drawLine(100,100,100,100);//画⼀个点。
2. 画矩形有两种矩形:普通型和圆⾓型。
(1) 画普通矩形有两个⽅法:drawRect(int x,int y,int width,int height):画线框围起来的矩形。
其中参数x和y指定左上⾓的位置,参数width和height是矩形的宽和⾼。
fillRect(int x,int y,int width,int height):是⽤预定的颜⾊填充⼀个矩形,得到⼀个着⾊的矩形块。
以下代码是画矩形的例⼦:g.drawRect(80,100,40,25);//画线框g.setColor(Color.yellow);g.fillRect(20,70,20,30);//画着⾊块(2)画圆⾓矩形也有两个⽅法:drawRoundRect(int x,int y,int width, int height, int arcWidth, int arcHeight):是⽤线围起来的圆⾓矩形。
其中参数x和y指定矩形左上⾓的位置;参数width和heigth是矩形的宽和⾼;arcWidth和arcHeight分别是圆⾓弧的横向直径和圆⾓弧的纵向直径。
fillRoundRect(int x,int y,int width,int height,int arcWidth,int archeight):是⽤预定的颜⾊填充的圆⾓矩形。
javagui知识点总结
javagui知识点总结一、Swing GUI组件Swing是Java中用于创建GUI的一套组件库,它提供了丰富的GUI组件,包括按钮、文本框、标签、列表框、表格等等。
这些组件可以通过代码进行创建、配置和操作,从而构建出丰富多彩的用户界面。
Swing组件还支持丰富的外观和行为定制,可以通过设置各种属性和监听器来满足不同的需求。
1.1 按钮(Button)按钮是Swing中最基本的GUI组件之一,它通常用于触发某个操作或事件。
在Swing中,按钮可以通过JButton类来创建,可以设置按钮的文本、图标、颜色、大小、位置等属性,并为按钮添加各种监听器来处理用户的点击事件。
1.2 文本框(TextField)文本框用于接受用户的输入,可以通过JTextField类来创建,可以设置文本框的默认文本、颜色、大小、位置等属性,并通过添加文本变化监听器来实时监测用户的输入。
1.3 标签(Label)标签用于显示静态文本信息,可以通过JLabel类来创建,可以设置标签的文本、字体、颜色、大小、位置等属性,还可以通过添加鼠标事件监听器来实现交互式标签。
1.4 列表框(ListBox)列表框用于显示一组选项供用户选择,可以通过JList类来创建,可以设置列表框的选项、颜色、大小、位置等属性,并为列表框添加选择事件监听器来处理用户的选项选择。
1.5 表格(Table)表格用于显示和编辑二维数据,可以通过JTable类来创建,可以设置表格的数据模型、列模型、传输器、颜色、大小、位置等属性,并为表格添加各种监听器来处理表格的编辑和选择事件。
二、事件处理在Java GUI编程中,事件处理是至关重要的一部分,它用于实现用户界面和用户交互的逻辑。
Swing组件提供了丰富的事件类型,包括鼠标事件、键盘事件、焦点事件、窗口事件等等,开发人员可以通过添加事件监听器来处理这些事件,从而实现用户交互的各种效果。
2.1 事件监听器(EventListener)事件监听器是一种特殊的接口,用于监听和处理特定类型的事件。
Java图形处理-Paint方法、Update方法和Repaint方法
其中:前三个分量即RGB颜色模式中的参数,第四个alpha 分量指透明的程度。当alpha分量为255时,表示完全不透明, 正常显示;当alpha分量为0时,表示完全透明,前三个分量不 起作用,而介于0~255之间的值可以制造出颜色不同的层次效 果。
Image samImage; public void init() {
samImage=getImage(getDocumentBase(),"sample.gif"); }
public void paint(Graphics g) {
//g.clipRect(50,50,180,180);
//画线 g.drawLine(0,0,20,30);
//3D矩形 g.draw3DRect(80,80,40,40,true);
g.draw3DRect(100,100,40,40,false); g.fill3DRect(120,120,40,40,true); //椭圆 g.drawOval(150,150,30,40); g.fillOval(170,170,20,20);
例如:
Font f = new Font("TimesRoman", Font.BOLD + Font.ITALIC, 12); 创建了具有粗斜体风格的12磅的TimesRoman字体。
【例1】设置Graphics对象画图,显示结果如图1所示。源程 序代码如下:
//程序文件名SimpleGui.java import java.awt.*; import java.applet.*; public class SimpleGUI extends Applet {
Java Graphics的paint和repaint方法
调用paint的一般是repaint()或当显示器刷新的时候调用的类似repaint()的类。
当对于桌面执行了某类操作,改变了桌面上的图象时,jvm收到界面被调整的信息,此时会调用visible是ture的图形组件的repaint()方法对界面重绘。
当然,直接重绘或全部重绘是很亏的,一个是用双缓存技术,另一个是只对桌面上显示的部分重绘。
双缓存是指在缓存内先模拟重绘过程,只把最后成形的结果传给显示器显示。
部分重绘就是指使用repaint(Dimension area)及类似的方法,只重绘与需调整的部分相关的界面。
幸运的是,目前jdk提供的repaint()并不是傻呼呼的就直接重绘所有组件,已经用了上述两种方法优化过了。
所以即使反复调用repaint()也不会有效率的损失。
repaint()是重要概念,它是在图形线程后追加一段重绘操作,是安全的!是系统真正调用的重绘!所以如果你需要某个部件刷新一下界面,记得调用repaint(),千万不要直接调用paint()!paint()是提供给用户编程的,往往声明在接口之中,然后用户实现该接口,以拥有重绘的功能。
若要定制某个图形组件的界面,可以重写paint()方法,记得一般习惯这样改写:void paint(Graphics g){super.paint(g);// your code}除了paint(),有的组件会有paintBorder()之类的专门用于某个部分重绘的方法,不过一般是protected 的,在对该类组件扩展的时候可以重写该方法。
最后,graphics是一个抽象类,其实现大都是平台相关的,所以不容易自己创建一个graphics 实例。
一般graphics的实例会由依照你所在的桌面环境给出。
Graphics类及其子类Graphics2D提供的只是一些基本绘图方法,比如画直线、曲线什么的。
所以做一个图形组件的基本思路可以总结为以下过程:选择适合的基本图形组件-> 继承它-> 重写paint等方法-> 在需要刷新图形的时候调用repaint等方法!至于Graphics,先假设它存在,因为真正的Graphics实例只有当程序在jvm上跑的时候才会创建。
Java的GUI设计打造美观直观的用户界面
Java的GUI设计打造美观直观的用户界面Java是一种广泛使用的编程语言,拥有着强大的图形用户界面(GUI)设计能力。
通过使用Java提供的各种GUI库和工具,开发人员可以轻松地创建美观、直观的用户界面。
本文将介绍一些在Java中实现这样的GUI设计的方法和技巧。
一、选择合适的GUI库在Java中,有多个GUI库可供选择,比如Swing、JavaFX等。
选择合适的GUI库是设计美观直观界面的第一步。
Swing是一个成熟的GUI库,提供了丰富的组件和布局管理器,可以满足大部分GUI设计需求。
JavaFX是Java官方推荐的GUI库,它提供了更现代化的界面设计风格和更优秀的性能。
二、使用布局管理器布局管理器是GUI设计中重要的一环,它定义了组件在窗口中的位置和大小。
Java提供了多种布局管理器,如FlowLayout、BorderLayout、GridLayout等。
通过合理选择和组合这些布局管理器,可以实现各种复杂的界面布局。
三、使用合适的图标和图片图标和图片在GUI设计中起着很重要的作用,可以通过它们来提升用户界面的美观性和直观性。
Java提供了处理图标和图片的功能和类库,开发人员可以使用这些功能来加载、处理和显示各种图标和图片。
四、使用合适的颜色和字体颜色和字体也是GUI设计中非常重要的元素,可以用来强调界面的重要信息或者创建特定的视觉效果。
Java提供了各种颜色和字体的类库和功能,可以用来选择合适的颜色和字体样式。
五、增加交互性一个好的用户界面应该具有良好的交互性,能够方便用户进行操作。
Java提供了丰富的事件处理机制和监听器,可以实现交互性功能。
开发人员可以通过监听用户的操作,及时响应并更新界面,实现更好的用户体验。
六、进行界面美化除了以上的基本设计原则,开发人员还可以通过一些额外的技巧来进一步美化用户界面。
比如使用渐变色背景、添加阴影效果、使用动画效果等。
这些技巧可以使界面更加生动、有趣,并提升用户的整体体验。
javapaint方法
javapaint方法在Java中,可以使用paint方法来实现对组件进行绘制的功能。
paint方法是Swing组件中的一个方法,用于进行组件的绘制操作。
下面将详细介绍Java的paint方法。
首先,paint方法是在组件需要被重绘时由Java虚拟机自动调用的,应用程序通常无需自己调用paint方法。
在组件首次显示时或需要进行重绘时,paint方法将自动被调用。
paint方法的方法签名如下:```public void paint(Graphics g)```paint方法的参数是一个Graphics对象,它提供了一系列的绘图方法用于完成绘制操作。
在paint方法中,通常需要完成以下几个步骤:1. 获取Graphics对象:用于绘制的Graphics对象可以通过paint方法的参数获取,此时可以使用Graphics对象的各种方法来完成绘制操作。
2. 设置绘图属性:在开始绘制之前,通常需要设置一些绘画属性,比如绘图颜色、线条粗细等。
Graphics对象提供了一系列用于设置绘画属性的方法,比如setColor、setStroke等。
3. 进行绘制操作:在绘制之前,需要确定绘制的内容和位置。
根据需要,可以使用Graphics对象的各种绘图方法,如drawLine、drawRect、fillRect等来绘制需要的图形。
4. 释放资源:绘制操作完成后,通常需要释放绘图资源,以便其他组件或画布进行绘制操作。
可以通过Graphics对象的dispose方法来释放绘图资源。
下面是一个简单的示例代码,展示了如何在一个JPanel类中使用paint方法进行绘制操作:```javaimport javax.swing.*;import java.awt.*;public class MyPanel extends JPanelpublic void paint(Graphics g)super.paint(g);//设置绘图属性g.setColor(Color.RED);//绘制操作g.drawLine(10, 10, 100, 100);g.drawRect(50, 50, 100, 100);g.fillRect(200, 200, 100, 100);//释放资源g.dispose(;}```在上面的代码中,首先继承了JPanel类,并重写了其paint方法。
JavaGUI使用标签与按钮方法详解
JavaGUI使用标签与按钮方法详解
JavaGUI是使用(Graphical User Interface)图形用户界面的Java编程语言的一种方法,它使程序员可以创建可视化的图形界面,使人们能够用更直观的方式来操作计算机。
JavaGUI通常使用标签(Labels)和按钮(Buttons)这两种控件来创建窗口界面。
标签是一个文本字段,它可以用来显示信息、提示文字或指导操作,它不可以直接可交互,而只能作为一个视觉元素,告诉用户这里有什么信息和功能,但不能独立去操作程序。
使用标签还可以将一组控件组合在一起,分组显示,让用户的操作更加清晰和方便,通常用于表单设计和用户输入校验。
按钮是用户交互的重要控件,它是一个特殊的文字控件,但可以实现点击的功能,当用户点击按钮时,就会触发程序的相应操作,它是实现用户与程序间对话的重要控件。
按钮控件通常有多种显示样式,可以让用户可视化地预览,例如悬浮按钮、放大按钮、警示按钮等,使按钮的设计更具有层次和表现力。
JavaGUI中的标签和按钮具有不同的功能,但都是重要的GUI 控件,它们在设计用户界面时具有不可替代的作用。
程序员可以通过合理使用它们来设计出更直观易用的窗口界面,从而让用户更快更好地操作计算机。
跟我学Java面向对象程序设计技术及应用——Java GUI控件及事件编程技术及应用
1.1Java GUI控件及事件编程技术及应用[本讲的知识要点]AWT、paint()格式及绘制的时机、基本组件。
容器组件、菜单条菜单组件、弹出式菜单组件编程技术事件编程。
1.1.1Java GUI编程的基础知识1、GUI界面用户与程序之间交互的一个控制面板,其内包含有菜单,控件(或组件),容器并能响应用户的事件。
2、Java中的GUI实现方式采用AWT(抽象窗口工具集)从而可使GUI适用于不同OS的环境。
3、主要的技术特点(1)其具体实现由目标平台下的OS来解释,从而导致Java GUI在不同平台下会出现不同的运行效果(窗口外观、字体等的显示效果会发生变化)。
(2)组件在设计时不应采用绝对定位,而应采用布局管理器来实现相对定位,以达到与平台及设备无关。
(3)AWT组件及事件响应不及微软的SDK丰富(因为有些OS平台无微软的Windows组件),Sun在Java2中新增了Swing GUI组件。
4、Java Applet及Application程序的用户界面设计(1)Applet程序的GUI特点1)它继承Panel类,因而可通过AWT来实现Applet程序的GUI组件及事件处理;2)由于Applet是在浏览器窗口内显示的,因而不必象Panel面板那样必须包含在一个独立的窗框Frame对象中;③不能利用setTitle()在Applet中设置窗标,也不必提供菜单(可改用按钮来代替);3)Applet程序的背景色可以采用setBackground()设置,其大小可采用resize()重设置,也可直接在HTML中采用width、Height来指定。
5、Java AWT中组件种类(1)基本组件它不能独立地显示出来并且在其内不能再包含其它的组件(如Button、Checkbox、Choice、Canvas、Label、TextField、TextArea、List、Scrollbar等是AWT中的基本组件)。
深入分析JavaME手机游戏开发中paint方法的应用
这 些类 的增加 不仅 降低 了游 戏开 发过 程 中错误 出现 的几 率 ,也使游 戏
代 码更 精悍 ,游 戏 的专属 特 性诸 如地 图 绘制 、人 物动 态显 示 、碰撞 检测 、
图层控制 等都 能够在 移动 设备 上得 到最大 程度 的显现 。
这几 个类之 间 的关系 如 图一 :
的子类:Sr t类和T lda e类。在此我们简要说明一下每个类 的作用 p ie ieL yr
2Ga C n a 类 的p it 法 me a v s an方 2 1 C n a 类的p t av s a 方法 i n 在低 级界 面屏 幕C n a 抽 象类 中 ,其唯 一 av s 的抽 象方 法是 :
’ 。。。’ ’。’ 。 ’’ … ’ 一 。‘ ‘。。。 。。’。。。。。。。。。。。。 。。 。。。’。 ‘。。。 。。。。。 。一
p o e t d v i a n (r p is g ; r t c e o d p it G a h c )
由于G mC na 类本 身就 拥有 屏幕 缓冲 ,因此 其绘 图方 式与 Cna 类 a eav s avs 不 同,它通 过g trp is 法获得 屏幕 显示 的控制 权 ,因此 无需通 过实现 eG ah c方 p it 法 实现 屏 幕显 示 。 以下 的 例子 是 在屏 幕 上 显示 一 个位 于 屏幕 中 央 a n方 3*0 0 3 的红色 正方形 ,使 用Gm Cn a类 实现 ,其代 码如 下 : ae av s
1Ga 包简 介 me JvM 开 发框 架 由C n iua in ( 置 )和P o ie( 表 )组成 , a ae o fgr to 配 rf1 简
在 手机程 序 开发 中使 用 了C D ( 限连 接设 备 配置 )并 在此 基础 上建 立 了 LC 有
JAVA-画图工具全解
摘要随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
JAVA是一门很优秀的编程语言,具有面向对象、与平台无关、安全、稳定和多线程等特点,是目前软件设计中极为健壮的编程语言。
JAVA不仅可以用来开发大型的应用程序。
而且特别适合Internet的应用开发。
JAVA确实具备“一次写成,处处运行”的特点,JAVA以成为网络时代最重要的编程语言之一。
本报告中介绍了用JAVA语言实现画笔系统的全部过程。
本次课程设计是配合JAVA程序设计课程,帮助我们深入学习掌握JAVA语言,熟练运用这个工具来编写的。
通过课程设计各个项目的综合训练,培养学生实际分析问题、编程和动手能力、提高学生的综合素质。
本课程设计尝试使用一些较生动的示例和设计项目,激发学生学习兴趣,引导学生主动学习,正确理解、接受需要重点掌握的知识点,为参加项目开发及更深入学习做好准备。
本次课程设计主要是用JAVA实现画笔系统,其系统主要完成以下功能:设计一个画图程序,能够实现画笔、画直线、画圆形、画矩形、修改该画笔的大小以及颜色。
该画图程序还需具有橡皮擦功能以及清空整个画面的功能关键词:画图工具,JA V A目录摘要 (1)目录 (2)1.绪论 (3)2. 开发环境介绍 (4)3.需求分析 (5)3.1总体目标..................................... 错误!未定义书签。
3.2要实现的功能 (7)4.概要设计 (8)4.1设计准备 (8)4.2需要用到的类 (8)5.详细设计 (9)5.5类的设计 (9)5.2类的方法设计 (9)6.测试数据及运行结果 (8)7.总结 (15)8.参考文献 (15)9.源程序 (15)1.绪论Java不依赖平台的特点使它受到广泛的关注,Java已成为网络时代最重要的语言之一。
目前,Java语言不仅是一门被广泛使用的编程语言,而且已成为软件设计开发者应当掌握的一门基础语言。
java中paint方法和paintComponent方法的不同
java中paint⽅法和paintComponent⽅法的不同/*1.由Component.java源代码中可以看见其中的paint()⽅法体是空的,在Container中重写了该⽅法,其⼦类Window等也重写了该⽅法2.由JComponent.java源代码中可以看见其中的paint()⽅法中调⽤paintComponent, paintChildren, paintBorder等⽅法;所以该类中的paint⽅法会影响⼦组件的绘制,⽽paintComponent⽅法只会影响该组件本⾝3.paint⽅法和 paintComponent⽅法都是对⼀个组件进⾏渲染的(组件创建并显⽰之后),并不是产⽣和显⽰该组件的!4.swing 组件和 awt组件 paint⽅法的不同:awt组件的paint⽅法有⾃动刷新背景颜⾊的功能,⽽swing组件⼀定要调⽤super.paint()*/import java.awt.*;import java.awt.event.*;import javax.swing.*;public class BkGnd extends Frame{public BkGnd(){setTitle("更换背景!");setSize(new Dimension(600, 600));setLayout(new FlowLayout());myPanelOne panel = new myPanelOne();panel.setBackground(Color.yellow);panel.setPreferredSize(new Dimension(500, 500));myPanelTwo pl = new myPanelTwo();pl.setPreferredSize(new Dimension(400, 400));pl.setBackground(Color.blue);panel.add(pl);add(panel);addWindowListener(new MyClosingListener());}public static void main(String args[]){BkGnd myFrame = new BkGnd();myFrame.setVisible(true);}}/*//第⼀种情况: 如果没有super.paint(g);则该⾯板上的组件将不能正常显⽰//如果加上super.paint(g);那么⾸先通过该⽅法将该⾯板上的组件显⽰出来,然后在执⾏super.paint(g);下⾯的绘图语句。
swing组件的paint问题_技术专辑
swing组件的paint问题_技术专辑症状一:调用jframe的repaint()方法时为什么不会自动引发paintcomponent()方法?(不过会引发paint()方法)症状二:引发paint()方法后,我用drawstring()方法在jframe中画字符串,不能显示,不过改变jframe的大小时会正确显示。
其实repaint()方法,好像是这样的,如果有paint()方法则调用paint()方法,没有paint()方法而有paintcomponent()方法则调用paintcomponent()方法,下面代码就是为了测试。
你可以测试有paint()方法,和注释掉paint()方法两种情况。
import javax.swing.*;import java.awt.*;import java.awt.event.mouseadapter;import java.awt.event.mouseevent;import java.awt.graphics2d;public class testpanel extends jframe { ttt panel = new ttt();jpanel pnlctl = new jpanel();jbutton button = new jbutton("draw line");jbutton button2 = new jbutton("clear all");public testpanel() {container cp = this.getcontentpane();cp.add(panel,borderlayout.center);button.addmouselistener(new mouseadapter(){public void mouseclicked(mouseevent me){graphics2d g2 = (graphics2d) panel.getgraphics();g2.drawrect(20,20,100,300);panel.repaint();}});button2.addmouselistener(new mouseadapter(){public void mouseclicked(mouseevent me){panel.getgraphics().clearrect(0,0,700,400);}});pnlctl.add(button);pnlctl.add(button2);cp.add(pnlctl,borderlayout.north);setsize(800,600);this.setdefaultcloseoperation(jframe.exit_on_close);this.show();}public static void main(string[] args) { testpanel testpanel = new testpanel();}}class ttt extends jpanel{public ttt(){super();}public void paintcomponent(graphics g){joptionpane.showconfirmdialog(null,"paintcomponent() called");graphics2d g2 = (graphics2d) g;g2.drawline(10,10,300,300);}//如果要试验没有paint()的情况注释掉下面的方法public void paint(graphics g){joptionpane.showconfirmdialog(null,"paint() called");graphics2d g2 = (graphics2d) g;g2.drawrect(20,20,300,300);}}。
paint方法的参数类型
paint方法的参数类型
Java中的paint方法是一个重要的方法,用来绘制图形和文本。
在使用paint方法时,需要指定一些参数类型,这些参数类型包括: 1. Graphics类型:表示绘制的上下文环境,可以在该对象上进行绘制操作。
2. Dimension类型:表示绘制区域的大小,也就是绘制的区域的宽和高。
3. ImageObserver类型:表示图像的观察者,用于观察图像的加载过程,当图像加载完成后,通知绘制操作进行绘制。
4. JComponent类型:表示绘制的组件,也就是绘制的目标组件,可以在该组件上进行绘制操作。
5. Rectangle类型:表示绘制的矩形区域,可以指定绘制的范围。
通过指定这些参数类型,可以使得绘制操作更加灵活和精确。
同时,也可以通过使用具体的参数类型,来实现不同的绘制效果和功能。
因此,在使用paint方法时,需要仔细考虑参数类型的选择和使用方式,以达到最佳的绘制效果和性能。
- 1 -。
24.11.4 Paint方法_Java从入门到精通_[共2页]
47728 String whiteMessage ="无限制";24.11.3 主类的构造函数01 public FiveChessFrame() {02 // 设置标题03 this.setTitle("五子棋");04 // 设置窗体大小05 this.setSize(500, 500);06 // 设置窗体出现位置07 this.setLocation((width - 500) / 2, (height - 500) / 2);08 // 将窗体设置为大小不可改变09 this.setResizable(false);10 // 将窗体的关闭方式设置为默认关闭后程序结束11 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);12 // 为窗体加入监听器13 this.addMouseListener(this);14 // 将窗体显示出来15 this.setVisible(true);16 t.start();17 t.suspend();18 // 刷新屏幕,防止开始游戏时出现无法显示的情况19 this.repaint();20 String imagePath ="" ;21 try {22 imagePath =System.getProperty("user.dir")+"/bin/image/background.jpg" ;23 bgImage =ImageIO.read(new File(imagePath.replaceAll("\\\\", "/")));24 } catch (IOException e) {25 // TODO Auto-generated catch block26 e.printStackTrace();27 }28 }24.11.4 Paint方法01 public void paint(Graphics g) {02 // 双缓冲技术防止屏幕闪烁03 BufferedImage bi =new BufferedImage(500, 500,04 BufferedImage.TYPE_INT_RGB);。
JavaPainter代码解释
JavaPainterimport java.awt.Point;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import javax.swing.JPanel;public class PaintPanel extends JPanel{private int pointCount = 0; // 计算点的数量// 创建一个10000容量的数组private Point points[] = new Point[ 10000 ];// 创建GUI,处理鼠标响应事件public PaintPanel(){// 处理鼠标移动事件addMouseMotionListener(new MouseMotionAdapter() // 匿名内部类{//存储拖动的坐标,重新绘制public void mouseDragged( MouseEvent event ){if ( pointCount < points.length ){points[ pointCount ] = event.getPoint(); // 获取点pointCount++; // 向数组增加点的数量repaint(); // 绘制JFrame}}});}public void paintComponent( Graphics g ){super.paintComponent( g ); //清空绘图区// 画出数组里的所有点for ( int i = 0; i < pointCount; i++ )g.fillOval( points[ i ].x, points[ i ].y, 4, 4 );}}主函数public class Painter{public static void main( String args[] ){// 创建一个JFrameJFrame application = new JFrame( "A simple paint program" );PaintPanel paintPanel = new PaintPanel(); // 创建一个画板application.add( paintPanel, BorderLayout.CENTER ); // 居中application.add( new JLabel( "Drag the mouse to draw" ),BorderLayout.SOUTH );application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );application.setSize( 400, 200 );application.setVisible( true );}}。
Java GUI中的paint方法疑难解析
Java GUI中的paint方法疑难解析
张亚利;吴彦国
【期刊名称】《科技风》
【年(卷),期】2018(000)015
【摘要】在进行Java GUI编程时,程序利用paint(Graphics g)方法来实现组件的绘制;然而Java的绘图机制是怎样的,paint方法又是何时调用、如何调用,且每次调用时paint方法的执行次数是怎样的?轻量级和重量级组件调用paint有哪些区别等,本文作者将针对这些问题,用案例分析的方法来一一解答.
【总页数】1页(P59)
【作者】张亚利;吴彦国
【作者单位】河南省工业设计学校河南郑州 450000;河南省工业设计学校河南郑州 450000
【正文语种】中文
【相关文献】
1.Java GUI布局管理方法探讨 [J], 潘红改;李国贞
2.Java复合数据类型组件及其MVC模型在GUI定制开发中的应用 [J], 文永革
3.Java布局管理器在GUI设计中的应用 [J], 李利;王秀峰
4.Java 2 AWT中paint()和repaint()方法的合理使用 [J], 曹大有
5.VB中Paint Picture图形方法的使用 [J], 金凤霞
因版权原因,仅展示原文概要,查看原文内容请购买。
JAVA画图板实现(基本画图功能+界面UI)二、功能实现及重绘实现
JAVA画图板实现(基本画图功能+界⾯UI)⼆、功能实现及重绘实现上篇博客中介绍了界⾯的实现⽅法,在这篇博客中将对每个按钮的功能的实现进⾏讲解并介绍重绘⾸先肯定要添加事件监听机制了,那么问题来了,事件源对象是谁?需要添加什么⽅法?事件接⼝是什么?1、我们需要点击按钮,获取按钮上的⽂字信息,颜⾊信息,粗细信息。
那么,此时事件源对象就是按钮,监听⽅法就是addActionListener(ActionListener e),事件接⼝就是ActionListener2、要根据在窗体上按下和释放的位置画⼀个图形,此时事件源对象就是窗体,监听⽅法就是addMouseListener(MouseListener e),事件接⼝就是MouseListener1public class DrawListener extends MouseAdapter implements ActionListener {23private Color color = Color.black;// 声明颜⾊属性,存储⽤户选择的颜⾊4private int width = 1;// 声明粗细属性,存储⽤户选择的粗细5private String type = "Line";// 声明图形属性,存储⽤户选择的图形6private int x1, y1, x2, y2, x3 = 0, y3 = 0, x4 = 0, y4 = 0, x5, y5;// 声明坐标值属性,存储⿏标按下和释放的坐标值7private Graphics2D g;// 声明画笔类属性,组件是画出来的,现在要在组件上画图形,Graphics从组件上获取8private DrawMain dm;// 声明画图程序窗体组件属性9private JTextField text;// 获取⽂本框内容10private double H = 100;// 等腰三⾓形的⾼度11private int num = 0;12private List<Shape> list;13private ImageIcon i = new ImageIcon("C:\\Users\\long452a\\Desktop\\a1.jpg");1415/**16 * 构造⽅法17 *18 * @param dm画图程序的窗体组件对象19*/20public DrawListener(DrawMain dm, JTextField text, List<Shape> list) {21this.dm = dm;22this.text = text;23this.list = list;24 }2526/**27 * 点击按钮时执⾏的事件处理⽅法28 *29 * @param e对象中存储了事件源对象的信息和动作信息30*/31public void actionPerformed(ActionEvent e) {32 }3334/**35 * Invoked when the mouse button has been clicked (pressed and released) on a36 * component.37*/38public void mouseClicked(MouseEvent e) {39 }4041/**42 * Invoked when a mouse button has been pressed on a component.43*/44public void mousePressed(MouseEvent e) {45 }4647/**48 * Invoked when a mouse button has been released on a component.49*/50public void mouseReleased(MouseEvent e) {51 }5253public void mouseDragged(MouseEvent e) {54 }55 }这样我们的类就建好了,下⾯就该写⾥⾯的⽅法了1/**2 * 点击按钮时执⾏的事件处理⽅法3 *4 * @param e对象中存储了事件源对象的信息和动作信息5*/6public void actionPerformed(ActionEvent e) {7 String text = e.getActionCommand();8if (text.equals("")) {9 JButton button = (JButton) e.getSource();10 color = button.getBackground();11 } else if (text.equals("1") || text.equals("3") || text.equals("5")) {12 width = Integer.parseInt(text);13 } else {14 type = text;15 }16// System.out.println(color + ">>" + width + ">>" + type);17 }1819/**20 * Invoked when the mouse button has been clicked (pressed and released) on a21 * component.22*/23public void mouseClicked(MouseEvent e) {24 x4 = x2;25 y4 = y2;26 }2728/**29 * Invoked when a mouse button has been pressed on a component.30*/31public void mousePressed(MouseEvent e) {32 x1 = e.getX() + 7;33 y1 = e.getY() + 183;34if (y1 < 183)35 y1 = 183;36 g = (Graphics2D) dm.getGraphics();// 从窗体上获取画笔对象37 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 设置画笔抗锯齿38 g.setColor(color);// 设置画笔颜⾊39 g.setStroke(new BasicStroke(width));// 设置画笔线条粗细4041 }4243/**44 * Invoked when a mouse button has been released on a component.45*/46public void mouseReleased(MouseEvent e) {47 x2 = e.getX() + 7;48 y2 = e.getY() + 183;49if (y2 < 183)50 y2 = 183;51if (type.equals("iso_Tri")) {52if (x1 == x2) {53 g.drawLine(x1, y1, x2, y2);54 g.drawLine(x1, y1, x1 + (int) H, (y2 + y1) / 2);55 g.drawLine(x2, y2, x1 + (int) H, (y2 + y1) / 2);56 list.add(new Shape(x1, y1, x2, y2, width, color, type, i, dm, text));57 list.add(new Shape(x1, y1, x1 + (int) H, (y2 + y1) / 2, width, color, type, i, dm, text));58 list.add(new Shape(x2, y2, x1 + (int) H, (y2 + y1) / 2, width, color, type, i, dm, text));59 } else if (y1 == y2) {60 g.drawLine(x1, y1, x2, y2);61 g.drawLine(x1, y1, (x1 + x2) / 2, y1 + (int) H);62 g.drawLine(x2, y2, (x1 + x2) / 2, y1 + (int) H);63 list.add(new Shape(x1, y1, x2, y2, width, color, type, i, dm, text));64 list.add(new Shape(x1, y1, x1 + (x1 + x2) / 2, y1 + (int) H, width, color, type, i, dm, text));65 list.add(new Shape(x2, y2, x1 + (x1 + x2) / 2, y1 + (int) H, width, color, type, i, dm, text));66 } else {67double a = Math.atan((double) (x2 - x1) / (double) (y2 - y1));68double x3 = (double) (x1 + x2) / 2 + H * Math.cos(a);69double y3 = (double) (y1 + y2) / 2 - H * Math.sin(a);70 g.drawLine(x1, y1, x2, y2);71 g.drawLine(x1, y1, (int) x3, (int) y3);72 g.drawLine(x2, y2, (int) x3, (int) y3);73 list.add(new Shape(x1, y1, x2, y2, width, color, type, i, dm, text));74 list.add(new Shape(x1, y1, x1 + (int) x3, (int) y3, width, color, type, i, dm, text));75 list.add(new Shape(x2, y2, (int) x3, (int) y3, width, color, type, i, dm, text));76 }77 } else if (type.equals("Polygon")) {78if (num == 0) {79 g.drawLine(x1, y1, x2, y2);80 list.add(new Shape(x1, y1, x2, y2, width, color, type, i, dm, text));81 x5 = x2;82 y5 = y2;83 }84 num++;85if (num == 1) {86 x3 = x1;87 y3 = y1;88 }89if (x2 == x4 && y2 == y4) {90 g.drawLine(x1, y1, x3, y3);91 list.add(new Shape(x1, y1, x3, y3, width, color, type, i, dm, text));92 num = 0;93 } else {94 g.drawLine(x2, y2, x5, y5);95 list.add(new Shape(x2, y2, x5, y5, width, color, type, i, dm, text));96 x5 = x2;97 y5 = y2;98 }99 } else {100 Shape s = new Shape(x1, y1, x2, y2, width, color, type, i, dm, text);101 s.draw(g);102 list.add(s);103 }104 }105106public void mouseDragged(MouseEvent e) {107if (type.equals("Pencil")) {108 x2 = e.getX() + 7;//这⾥的+7 +183 是调出来的,能够使画的图是沿着⿏标109 y2 = e.getY() + 183;110if (y2 < 183)111 y2 = 183;112 Shape s = new Shape(x1, y1, x2, y2, width, color, type, i, dm, text);113 s.draw(g);114 list.add(s);115 x1 = x2;116 y1 = y2;117 } else if (type.equals("Erase")) {118 x2 = e.getX() + 7;119 y2 = e.getY() + 183;120if (y2 < 183)121 y2 = 183;122 Shape s = new Shape(x1, y1, x2, y2, width, Color.WHITE, type, i, dm, text);123 s.draw(g);124 list.add(s);125 x1 = x2;126 y1 = y2;127 } else if (type.equals("喷枪")) // 难点128 {129 Random rand = new Random();// 实例化⼀个随机数类的对象130int size = rand.nextInt(50);// 随机决定要画的点数131 x2 = e.getX() + 7;132 y2 = e.getY() + 183;133for (int j = 0; j < size; j++) {134// 在0-7之间可以取50次135int x = rand.nextInt(10);136int y = rand.nextInt(10);137// 不断改变(x1,y1)的坐标值,实现在(x1,y1)的周围画点138 Shape s = new Shape(x2 + x, y2 + y, x2 + x, y2 + y, width, color, type, i, dm, text); 139 s.draw(g);140 list.add(s);141 x1 = x2;142 y1 = y2;143 }144 }145 } 仔细看看代码,你也许注意到了,我在画图时创建了⼀个Shape对象,并且还把Shape对象存到了⼀个List中,为什么要这么做?你们可以去别⼈的博客上贴⼀个粗略实现的画图板代码,画⼏条直线然后再改变窗体的⼤⼩试试看,是不是画的直线不见了?那要怎么做才能使这些图形保存下来呢?这就需要⽤到重绘了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java GUI中的paint方法疑难解析
作者:张亚利吴彦国
来源:《科技风》2018年第15期
摘要:在进行Java GUI编程时,程序利用paint(Graphics g)方法来实现组件的绘制;然而Java的绘图机制是怎样的,paint方法又是何时调用、如何调用,且每次调用时paint方法的执行次数是怎样的?轻量级和重量级组件调用paint有哪些区别等,本文作者将针对这些问题,用案例分析的方法来一一解答。
关键词:绘图机制;paint;调用
学过Java程序设计语言的朋友都知道,在学习Java GUI编程时,我们都知道paint方法是用来绘制图形的。
有了paint方法,我们可以在Java中绘制各种漂亮的组件,或开发漂亮炫酷的游戏。
但是paint是如何调用的?程序启动时,paint方法执行了一次还是多次,原理是什么?另外Swing组件和AWT组件对super.paint方法是如何相应的,组件在处理动画时,对KeyListner又是如何响应的呢?关于这些细节性的问题,许多初学者总是模棱两可。
笔者经过查找资料,并写程序进行验证,得出一些结果,以供分享。
问题1:Java的绘图机制是怎样的?
AWT是使用回调机制来处理绘画的,并且这种机制对轻量级和重量级组件相同。
也就是说我们需要把渲染组件的代码写在一个可覆盖的特殊的方法中,这个方法是public void paint (Graphics g);其中 Graphics是图形上下文对象,用来完成具体的绘制工作。
paint方法由AWT框架调用或者由程序自身通过repaint方法来调用。
问题2:画图时,paint是何时调用,如何调用,调用几次的问题。
Java绘图时,用到的paint方法继承自AWT中的Component方法,该方法在对象加载时自动调用,用来绘制该组件内部的所有图形图像。
使用repaint()方法,可以再次调用paint 方法,实现组件的重绘。
但是paint方法是什么时候开始执行,执行了几次呢?下面我们用例子,来加以分析。
public class Test extends Applet//引入包的代码省略
{Image img = null;int t =0;
public void init(){System.out.print("初始化====");
img = getImage(getCodeBase(),"1.jpg");}
public void paint(Graphics g)
{t++;System.out.print("我是paint===="+t+"");
g.fillRect(50,50,80,80);//代码段1,绘制矩形
// g.drawImage(img,50,50,this); //代码段2,绘制图形}}
执行代码段1的结果:
初始化====我是paint====1
执行代码段2的结果:
初始化====我是paint====1我是paint====2……我是paint====47
从上面结果可以发现,启动浏览器时,系统自动调用init()方法进行程序初始化,接着系统自动找到paint()方法对图像进行绘制。
而且paint()方法调用的次数,跟绘制的内容有关,图形简单时,可能执行一次,图像复杂时,可能会自动调用很多次,直到图形图像完全绘制成功。
另外还有当组件大小发生改变,或组件有坏点(damage)需要被修复时,系统都会自发地调用repaint方法,进行组件的重绘。
问题3:Java程序绘图时,JPanel和Panel对super.paint()的响应问题。
Java通过调用paint()方法来绘制组件,但是 AWT框架中轻量级组件与重量级组件实现代码还是有区别的。
轻量级组件的绘制依赖与包含关系阶层中的重量级祖先组件,当这个祖先组件被通知绘制时,它将把绘制请求转化为绘制自身上任何可见的子孙组件,这个方法是由java.awt.Container 中的 paint()方法来完成的,因此任何Container的子类,在覆盖paint方法时一定要记得调用super.paint()来保证,它上面的轻量级子孙组件都被绘制到了。
代码可以这样来完成:
public class MyContainer extends Container {
public void paint(Graphics g) { // 先绘制自身内容,然后确保轻量级子组件被绘制
super.paint(g);}}
下面我们将通过案例,来观察:
class myPanel extends JPanel implements KeyListener //重要代码:继承JPanel/Panel
{int x=50;public myPanel(){addKeyListener(this);} //为面板增加键盘监听器
public void paint(Graphics g){super.paint(g);//重要代码段:super.paint
g.setColor(Color.orange); g.fillRect(x, 50, 60, 60);}//设置画笔颜色,填充矩形
public void keyPressed(KeyEvent e){x=x+10;repaint();//释放键盘,矩形向右移动10像素;}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}}
创建myPanel对象p,设置背景色为青色,同时在面板p上添加标签“测试super.paint ()”,程序将出现四种情况,对应3种效果。
(1)面板继承JPanel,且paint方法中调用super.paint(),所得结果如图2。
(2)面板继承JPanel,且paint方法中没有调用super.paint(),所得结果如图1。
(3)面板继承Panel,且paint方法中没有调用super.paint(),所得结果如图3。
(4)面板继承Panel,且paint方法中调用super.paint(),所得结果如图2。
问题4:处理动画时,JPanel和JApplet等Swing组件对KeyListner无响应的问题。
为面板增加键盘监听器KeyListner,若面板继承java.awt.Panel,那么当程序运行时,每敲击一次键盘,上述案例中的矩形方块开始向右移动10个像素的距离;但是若面板继承javax.swing.JPanel,敲击键盘,则无任何相应动作。
这又是什么原因引起的呢?
经过实验分析,笔者发现JPanel等Swing组件在渲染完成后,无法获取focus,所以我们只需要上层容器setvisible(true)之前,先设置 p.requestFocus();为面板对象获取焦点即可。
以上分析,希望对爱好Java GUI编程的学习者提供帮助。