我试图在Java中的Canvas中绘制两行,分别调用两个方法,但是当我绘制第二行时,第一行消失(Java清除屏幕).我怎么能避免这种情况?我想看两条线.我已经看过油漆教程(如何制作像Windows上的Paint这样的程序)用户使用鼠标绘制线条,当绘制一条线时,另一条线不会消失.他们只是调用paint方法,它不会清除屏幕.

如果有人能帮助我,我将不胜感激.

谢谢.

查看课程

import java.awt.BorderLayout;

import java.awt.Canvas;

import java.awt.Color;

import java.awt.Graphics;

import javax.swing.JFrame;

public class CircuitTracePlotView extends JFrame {

private CircuitTracePlot circuitTracePlot;

public CircuitTracePlotView() {

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

this.getContentPane().add(circuitTracePlot = new CircuitTracePlot(), BorderLayout.CENTER);

this.pack();

this.setSize(250,250);

this.setLocationRelativeTo(null);

this.setVisible(true);

circuitTracePlot.drawLine();

circuitTracePlot.drawOval();

}

}

class CircuitTracePlot extends Canvas {

private final static short LINE = 1;

private final static short OVAL = 2;

private int paintType;

private int x1;

private int y1;

private int x2;

private int y2;

public CircuitTracePlot() {

this.setSize(250,250);

this.setBackground(Color.WHITE);

}

private void setPaintType(int paintType) {

this.paintType = paintType;

}

private int getPaintType() {

return this.paintType;

}

public void drawLine() {

this.setPaintType(LINE);

this.paint(this.getGraphics());

}

public void drawOval() {

this.setPaintType(OVAL);

this.paint(this.getGraphics());

}

public void repaint() {

this.update(this.getGraphics());

}

public void update(Graphics g) {

this.paint(g);

}

public void paint(Graphics g) {

switch (paintType) {

case LINE:

this.getGraphics().drawLine(10, 10, 30, 30);

case OVAL:

this.getGraphics().drawLine(10, 20, 30, 30);

}

}

}

主要课程

import javax.swing.SwingUtilities;

import view.CircuitTracePlotView;

public class Main {

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

CircuitTracePlotView cr = new CircuitTracePlotView();

}

});

}

}

解决方法:

>你几乎不应该直接调用paint(…).我可以算一下我需要做的时间.

>不要通过在组件上调用getGraphics()来获取Graphics对象,因为它将返回非持久的Graphics对象.而是绘制BufferedImage并在paint方法中显示或在paint方法中绘制(如果是AWT).

>由于这是一个Swing GUI,因此不要使用AWT组件进行绘制.使用JPanel并覆盖paintComponent(…)方法,而不是paint(…)方法.否则你将失去Swing图形的所有好处,包括自动双缓冲.

>应该在paintComponent(Graphics g)覆盖中调用super.paintComponent(g)方法,通常作为此方法内部的第一个方法调用.这使组件可以自己进行管家绘画,包括擦除需要擦除的绘图.

>阅读有关Swing图形的教程,因为大部分内容都在那里得到了很好的解释.例如,请看这里:

编辑

>为了保持图像的持久性,我建议您绘制一个BufferedImage,然后在JPanel的paintComponent(…)方法中显示该图像.

>或者另一种选择是创建一个Shape对象集合,可能是一个ArrayList< Shape>并使用您想要绘制的Shapes填充它,然后在paintComponent(…)方法中将Graphics对象强制转换为Graphics2D对象并遍历Shape集合,使用g2d.draw(shape)绘制每个形状重复.

自Trash发布他的代码,…

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.*;

public class CircuitTracePlot2 extends JPanel {

private static final int PREF_W = 250;

private static final int PREF_H = PREF_W;

private int drawWidth = 160;

private int drawHeight = drawWidth;

private int drawX = 10;

private int drawY = 10;

private PaintType paintType = PaintType.LINE;

public CircuitTracePlot2() {

}

@Override

public Dimension getPreferredSize() {

return new Dimension(PREF_W, PREF_H);

}

public void setPaintType(PaintType paintType) {

this.paintType = paintType;

repaint();

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

if (paintType == null) {

return;

}

switch (paintType) {

case LINE:

g.drawLine(drawX, drawY, drawWidth, drawHeight);

break;

case OVAL:

g.drawOval(drawX, drawY, drawWidth, drawHeight);

break;

case SQUARE:

g.drawRect(drawX, drawY, drawWidth, drawHeight);

default:

break;

}

}

private static void createAndShowGui() {

final CircuitTracePlot2 circuitTracePlot = new CircuitTracePlot2();

JFrame frame = new JFrame("CircuitTracePlot2");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.getContentPane().add(circuitTracePlot);

frame.pack();

frame.setLocationByPlatform(true);

frame.setVisible(true);

int timerDelay = 2 * 1000;

new Timer(timerDelay , new ActionListener() {

private int paintTypeIndex = 0;

@Override

public void actionPerformed(ActionEvent arg0) {

paintTypeIndex++;

paintTypeIndex %= PaintType.values().length;

circuitTracePlot.setPaintType(PaintType.values()[paintTypeIndex]);

}

}).start();

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGui();

}

});

}

}

enum PaintType {

LINE, OVAL, SQUARE;

}

标签:java,screen,clear,paint,java-canvas

来源: https://codeday.me/bug/20190529/1178821.html

java paint清空_调用paint方法时Java清除屏幕 – 如何避免?相关推荐

  1. java关闭通道_调用map方法后,Java 7文件通道未正确关闭

    我正在研究一个sc2replay解析工具.我在MPQLIB http://code.google.com/p/mpqlib/之上构建它 不幸的是,该工具使用文件通道来读取bzip文件, 并使用map( ...

  2. java 中append()_调用append()方法在Java中构造一个StringBuffer对象

    StringBufferappend()方法将特定参数的String表示形式附加到序列中.它是java.lang.StringBuffer类的方法.此方法返回对该对象的引用. 该方法更改方法中调用的对 ...

  3. java方法调用原则,Java 中,在调用重载方法时,原则是(   )。_学小易找答案...

    [多选题]20世纪80年代后,国外企业伦理学进入了全面发展阶段,主要表现在( ). [判断题]扩展库numpy的isclose()和allclose()用来测试两个数组是否严格相等. [单选题]以下市 ...

  4. ios手机端 表单input调用focus方法时,光标不显示,但软键盘会弹出来,可以修改内容,需要修改内容后光标才显示

    功能: ios表单验证时,比如 输身份证号,失焦后验证身份证,如果不合法,就让光标跳到对应的输入框,我是不合法就调用focus方法,完了会跳过去,但是ios有个bug,它确实会定位到对应的输入框,而且 ...

  5. JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法

    JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法 参考文章: (1)JNI调用native方法出现 ...

  6. java高级用法之:调用本地方法的利器JNA

    文章目录 简介 JNA初探 JNA加载native lib的流程 本地方法中的结构体参数 总结 简介 JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做java native int ...

  7. 如何关闭线程池?会创建不会关闭?调用关闭方法时线程池里的线程如何反应?

    前言 相信大家在面试的时候经常会遇到「线程池」相关的问题,比如: 什么是线程池?线程池的优点? 有哪几种创建线程池的方式? 四种创建线程池的使用场景? 线程池的底层原理? 线程池相关的参数,比如Cor ...

  8. 子类调用父类方法时,方法中的变量用谁的

    public class T1 {private int a=6;public void ha(){System.out.println(this.a);} } public class T2 ext ...

  9. java:PropertyDescriptor+反射调用setter方法

    java:PropertyDescriptor+反射调用setter方法 1 前言 PropertyDescriptor文档如下: https://docs.oracle.com/javase/7/d ...

  10. java 线程休眠_百战程序员:java线程的休眠和回复

    sleep()介绍 sleep() 定义在Thread.java中. sleep() 的作用是让当前线程休眠,即当前线程会从"运行状态"进入到"休眠(阻塞)状态" ...

最新文章

  1. 程序员如何讲清楚技术方案
  2. selenium 文件下载
  3. HDFS文件系统基本文件命令、编程读写HDFS
  4. GRE词汇乱序版-夹生的词汇3
  5. .NET部分知识点整理
  6. 启动万维网发布服务(W3SVC)
  7. 焊盘脱落怎么办?莫慌,现在是飞线打圈圈教学时间
  8. C#中对泛型List进行分组输出元素
  9. CentOS7 安装 NextCloud
  10. html5简单提问,【问答技巧】怎样提问才能让我的问题更快速被解答?
  11. Hbase对应的Hadoop兼容版本
  12. C#开发高亮语法编辑器(一)——TextBox ,RichTextBox的局限性
  13. 1450. Russian Pipelines(spfa)
  14. AI人工智能技术还原康乾盛世三代皇帝样貌,太帅了!
  15. 新手入门makefile教程
  16. 一个亿,啪一下就没了!
  17. 寻宝游戏设定_第1集的答案(寻宝游戏)
  18. 网易AI出席2018世界人工智能大会,带来沉浸式交互体验
  19. api系列聚美优品的知识点
  20. CentOS7.4离线安装Openssh7.9p1

热门文章

  1. 实况足球2020修改服务器,实况足球2020指令一览,最近的指令更改你知道吗
  2. python c语言实现 书_用C语言实现python的扩展模块
  3. webmagic模拟登陆获取cookie_Python3爬虫:selenium模拟登录获取cookie提取数据,存入数据库MySQL...
  4. java 001 002_java笔记0x002:操作符
  5. android sdk shell,Android SDK命令行工具Monkey参数及使用解析
  6. 单文件浏览器_浏览器工作原理
  7. python兔子编程_少儿编程分享:手把手教你用Python编写兔獾大作战(完)
  8. [礼仪大赛常识]酒店客房服务礼仪
  9. jquery has 返回拥有匹配指定选择器的一个或多个元素在其内的所有元素
  10. linux 实现秒级定时任务