当前位置: 首页 > 面试题库 >

重涂而不清除

解晟睿
2023-03-14
问题内容

我正在研究模仿Paint的程序。问题是当我绘制新形状时,以前的形状会被删除。我试图注释掉我的paintComponents的超级调用,该调用可以工作,但是留下了太多的绘图。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class Canvas1 extends JPanel{

    Circle c;
    Rectangle r;
    Line l;
    String str;
    int x1,x2,y1,y2;
    Graphics g;
    int draw;
    int hollow=0;
    Color cc;


    public Canvas1(){

        LineListener listener = new LineListener();
        addMouseListener(listener);
        addMouseMotionListener(listener);


        setBackground (Color.white);
        setPreferredSize (new Dimension(400, 400));

    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(cc);
        if (this.draw == 1)
        {
            c = new Circle (x1,y1,x2,y2);
            if (hollow == 0)
            {
                c.hollow = false;
            }
            if (hollow == 1)
            {
                c.hollow = true;
            }
            c.draw(g);
        }
        if (this.draw ==2)
        {
            r = new Rectangle (x1,y1,x2,y2);
            if (hollow == 0)
            {
                r.hollow = false;
            }
            if (hollow == 1)
            {
                r.hollow = true;
            }   
            r.draw(g);
        }
        if (this.draw ==0)
        {
            l = new Line(x1,y1,x2,y2);
            l.draw(g);
        }
        if (this.draw ==3)
        {
            g.drawString(str, x1, y1);
        }

    }
    public void update(Graphics g) {
        paint(g);
        }
    private class LineListener implements MouseListener, MouseMotionListener{

        public void mousePressed(MouseEvent event){
            x1 = event.getX();
            y1 = event.getY();
            if (draw ==3)
            {
                str = JOptionPane.showInputDialog("Enter String");
                repaint();
            }
        }

        public void mouseDragged(MouseEvent event){
            if (draw ==1 || draw==2)
            {
                x2 = event.getX()-x1;
                y2 = event.getY()-y1;
            }
            if (draw ==0)
            {
                x2 = event.getX();
                y2 = event.getY();
            }
            repaint();

        }

        public void mouseClicked (MouseEvent event) {

        }
        public void mouseReleased (MouseEvent event) {
            if (draw ==1 || draw==2)
            {
                x2 = event.getX()-x1;
                y2 = event.getY()-y1;
            }
            if (draw ==0)
            {
                x2 = event.getX();
                y2 = event.getY();
            }
        }
        public void mouseEntered (MouseEvent event) {}
        public void mouseExited (MouseEvent event) {}
        public void mouseMoved (MouseEvent event) {}
    }
}

问题答案:

正如您所发现的,您需要调用super.paintComponent(g),否则JPanel背景不会被绘制,并且一切都是一团糟。问题在于,由于该draw字段只能是单个值,因此一次只能绘制一个形状。一种解决方案是创建一个ArrayList形状,然后在Listin中绘制每个形状paintComponent



 类似资料:
  • 问题内容: 我正在使用Java Swing编写游戏。我想在每次循环执行时绘制一下,并在之间稍加延迟以在屏幕上创建级联效果。我相信系统中的效率例程会将调用折叠为一个调用。无论如何,所有更改都在总延迟后立即发生。是否有某种方法可以强制系统立即重新绘制,然后在循环的每次迭代中延迟? 我的代码: 问题答案: 您可以用来强制立即重绘。 编辑:再次阅读您的问题后,对我来说,您可能正在事件分发线程上执行逻辑。这

  • 问题内容: 对不起,我进行了大量搜索,以查找这3个功能(绘画,重绘,paintComponent)之间如何相互作用,但我不知道。您能准确解释一下它们何时被调用(因为有时java会在没有我问他的情况下调用它),它们到底在做什么,它们之间有什么区别。谢谢 问题答案: 我不确定“ paint”,但是我可以解释repaint()和paintComponent()之间的关系。 根据我在Java方面的有限经验

  • 问题内容: 我知道这不是第一次问这个问题,但是回答并没有给我带来太大帮助,所以我正在帮助我最终将得到我的答案 我做了这个小游戏,我在轨道上开车(必须使用矩形)。当我使用方法时,代表汽车的矩形在新位置重新粉刷,但后面留下了痕迹。 我有这个代码: 问题答案: 在绘制方法中取消注释super.paint(g)[第87行]。 它负责清除画布上的任何陈旧对象。

  • 下面是我正在使用的代码: 执行这段代码后,它将清除整行文本,而不是只清除给定矩形内的文本。 为了更好地解释事情,我附上了pdf文档。 任何帮助都将不胜感激。

  • 问题内容: 我对重排和重绘之间的区别还不清楚(如果有任何区别) 似乎重排可能正在转移各种DOM元素的位置,其中重画只是呈现一个新对象。例如,在移除元素时将发生回流,而在更改其颜色时将发生重新绘制。 这是真的? 问题答案: 至于定义,从那篇文章: 一个 重绘 更改时的元素皮肤改变明显制成,但不影响其布局发生。 这方面的例子包括 ,,,或。根据Opera的说法,重绘是昂贵的,因为浏览器必须验证DOM树

  • 嗨, 我偶然发现了的一个问题,在这个问题上,进程应该不能访问数据。让我解释一下: 我有一个类似于下面示例的情况:我得到了几个运行,每个运行以不同的参数开始。他们并行计算他们的东西,没有理由相互交互。现在,正如我所理解的,当一个进程分叉时,它会复制自己。子进程与其父进程具有相同的(内存)数据,但是如果它更改任何内容,它将在自己的副本上进行更改。如果我想让更改在子进程的生命周期内继续存在,我会调用队列