无需清除即可重新喷漆

2023-12-12

我正在开发一个模仿 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形状并绘制每个形状List in paintComponent.

  • Example
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无需清除即可重新喷漆 的相关文章

随机推荐

  • 如何释放通用 TList

    我怎样才能释放一个通用的TList
  • Android 2.2 Spinner 在 Actionbar 中看起来很旧

    在 Android 2 2 上 我的 ActionBar 中的 Spinner 看起来非常丑陋 并且下拉文本颜色与背景颜色相同 这使得文本不可读 这是相关代码 spinner new Spinner getSupportActionBar
  • 身份函数:模板和自动的区别

    我正在为我的一些类编写一个身份函数 用于记录其调用的计数 长话短说 指标 目前 我正在尝试计算使用模板与使用模板的性能差异 优点auto 这是从我正在做的代码中摘取的一个简短示例 namespace Metrics unsigned lon
  • QTKit - 合并两个具有不同宽度和高度的视频?

    我刚刚制作了一个简单的应用程序 它使用 QTKit 将两个视频合并在一起 这里是problem 我刚刚发现 如果我尝试合并两个宽度和高度不同的视频 输出的视频的高度和宽度与大视频相同 但包含带有黑色和宽边框的小视频 问题 如何将两个视频合并
  • JavaFX InputMap/ActionMap 等效吗?

    我终于完全切换到 JavaFX 我非常热衷于按键功能 是否有一种与您在 Swing 中找到的 非常好的 热键架构等效的热键架构 对于 JavaFX 文本控制对象 它是如何工作的 我想如果我看一下一切都会变得清楚javafx scene co
  • 函数下的线显示范围

    我不知道这个的确切名称 所以我不知道我在寻找什么 我在一些编程视频中看到 当光标位于函数内部时 它会显示一条位于函数下方的线 然后向下直到函数作用域的末尾 如下图所示 这是一个扩展还是一个设置 我怎样才能启用它 有人可以帮帮我吗 这显然是最
  • PowerShell AzureRM 命令——避免 Save-AzureRMProfile 过期

    我使用以下命令自动化了 Azure 部署AzureRM命令集 这些命令行开关需要登录 所以我尝试使用提供保存的配置文件Save AzureRMProfile Select AzureRMProfile 然而 一段时间后 配置文件似乎过期了
  • 解析javascript中制表符分隔的文件

    我无法更改服务器端 但我得到的文件如下所示 0 20 59339 138402 1 11 20062 75276 2 32 07597 215573 3 12 2029 82012 4 6 800035 45701 5 0 6548425
  • Selenium:在同一选项卡中打开链接

    我通过 Selenium webdriver 单击链接 该链接将打开一个新窗口 我想强制该链接在同一窗口 和同一选项卡 中打开 这可能吗 大多数时候 这种情况不仅仅发生在特定链接上 Thanks 在单击链接之前更新链接的target财产给s
  • 奇怪的 toCharArray() 行为

    我正在尝试toCharArray 并发现一些奇怪的行为 Suppose private static final char HEX CHARS 0123456789abcdef toCharArray System out println
  • Haskell 中快速随机生成器的好选择

    我有一个用例 我想测试一些赌博游戏的程序 我需要的随机数应该在一个非常小的区域 1到9 并且不需要真正的质量 我发现 Haskell 的标准生成器对我来说太慢了 所以有人有更好的想法吗 The 梅森随机纯64包裹非常快 原样MWC 随机
  • 如何使用 bot builder sdk v4 中的中间件区分 Bot 到用户和用户到 Bot 消息?

    我在 sdk V4 Bot 中实现了一个中间件来拦截 bot 和用户之间的每条消息并记录自定义 mongo Db 我正在尝试为使用 SDK v4 构建的 Bot 实现类似的概念 看起来我可以使用以下代码来添加中间件 但是不确定如何区分机器人
  • 如何在 swift 中设置 NSUserDefault 中的字典?

    我有一个可变字典 以 Int Int 的形式 并希望保存它 我会像这样使用 NSUserDefaults var myDic NSMutableDictionary myDic 1 2 NSUserDefaults standardUser
  • 如果产品价格高于 Woocommerce 中的特定金额,请在产品价格前添加文本

    在 Woocommerce 中我尝试添加文本before价格如果高于 59 欧元 我尝试了以下代码 以及其他代码 但它们不起作用 add filter woocommerce get price html custom price mess
  • 错误 C2446:==:没有从 const char * 到 TCHAR * 的转换

    我有一个 TCHAR 定义如下 TCHAR szProcessName MAX PATH TEXT
  • “纯虚函数调用”消息框

    我的一个 C Winforms 应用程序随机显示一个 纯虚函数调用 消息框 当我单击该消息框的确定按钮时应用程序立即关闭 我在应用程序日志文件中找不到任何异常 并且事件日志为空 谁能告诉我这次崩溃的可能原因以及如何进一步分析问题的根本原因
  • 如何用 ImageIcon 完全填充 JButton 的表面?

    我尝试用 ImageIcon 完全填充 Jbutton 的 表面 到目前为止我的结果是 正如您所看到的 退出 标签的边缘和按钮的边缘之间仍然存在一些空间 您可以看到背景上有白蓝色填充的按钮 我想要的是用标签完全覆盖这个按钮 有没有办法做到这
  • 如何使 For 循环处理非整数

    以下代码很简单并且输出符合预期 CODE Option Explicit Sub Test loop2 Dim i As Long For i 3 To 3 Step 1 Debug Print i Next i End Sub OUTPU
  • 如何使用母版从 asp:content 页面访问母版页上的用户控件?

    我不断收到 让我成为一个做 xyz 的工具 的请求web app我们正在准备 因此 在第三次之后 我意识到将它们全部放在一起并使用母版页会更容易 我有一个名为 MessageCenter 的用户控件 用于显示错误 成功和参考消息 因此我将其
  • 无需清除即可重新喷漆

    我正在开发一个模仿 Paint 的程序 问题是当我绘制新形状时 以前的形状会被删除 我试图注释掉我对paintComponents的超级调用 它可以工作 但留下了太多的绘图 import java awt Color import java