在画布上看不到圆圈

Posted

技术标签:

【中文标题】在画布上看不到圆圈【英文标题】:Can't see circle on canvas 【发布时间】:2016-07-16 09:14:52 【问题描述】:

我真的想不通,我需要你的帮助。我创建了一个简单的 小程序。我有一个面板和一个画布。我在画布上画画。我添加画布 到面板。我将面板添加到小程序。我正在尝试在上面画一个圆圈 画布,但我看不到它。如果我调整小程序的大小,我可以看到圆圈 在画布后面闪烁。请帮忙。

        import java.applet.*;
        import java.awt.*;


        public class TestCanvas extends Applet implements Runnable
        
            Panel myPanel = new Panel();
            int x = 50;
            int y = 50;
            int width = 100;
            int height = 100;
            boolean startBall = false;

            Graphics bufferGraphics;
            Image offscreen;

            Thread t;

            public void init()
            
                canvas.setSize(500,500);

                //canvas.setMaximumSize(new Dimension(500,500));
                //canvas.setMinimumSize(new Dimension(50,50));
                myPanel.add(canvas);
                add(myPanel);
                //For double buffering
                offscreen = createImage(canvas.getWidth(),canvas.getHeight());
                bufferGraphics = offscreen.getGraphics();

            

            public void start()
            
                t = new Thread();
                t.start();
                startBall = true;

            

            public void stop()
            
                t = null;
            

            public void destroy()
            
                t = null;
            

            public void run()
            
                for ( ; ; )
                
                    try
                    
                        canvas.repaint();
                        Thread.sleep(100);
                    catch(InterruptedException e)



                
            

            class myCanvas extends Canvas
            
                private static final long serialVersionUID = 1L;

                public myCanvas()
                
                    setBackground(Color.yellow);
                    setSize(500, 300);
                    //setBounds(0, 0, 500, 300);

                   

            

            myCanvas canvas = new myCanvas();

            public void paint(Graphics g)
            
                g = canvas.getGraphics();
                bufferGraphics.clearRect(0,0,canvas.getWidth(), canvas.getHeight());
                bufferGraphics.setColor(Color.black);
                //x++;
                //y++;
                bufferGraphics.setColor(Color.black);
                bufferGraphics.fillOval(x, y, width, height);       
                g.drawImage(offscreen,0,0,null);        
            

            public void update(Graphics g)
            
                canvas.paint(g);
            



        

【问题讨论】:

你已经定义了一个对象和一堆函数。你怎么称呼这些物品? 让我们开始吧;小程序是一种死技术,几乎所有浏览器都没有主动阻止它们,并且 Java 插件停止了; awt 基本上在 16 年前就被 swing 取代了,所以除非你打算使用 BufferStrategy,否则你真的不需要使用基于 awt 的组件,swing 组件默认也是双缓冲的。现在,说了这么多,您尝试双缓冲通常是错误的,您应该使用 BufferedImage,而不是您所做的。您的 canvas 实际上并没有出现在屏幕上,但这就是您尝试绘制的内容 你的教授需要进入现代时代(抱歉),swing 和 awt 使用完全不同的绘画方法,我个人在 16 多年的专业 GUI 开发中从未使用过基于 awt 的框架。您需要知道,swing 是由 awt 支持的,但通常仅此而已。然而,它并没有否定小程序是一种死技术的事实,尽管我可能不喜欢它,Swings 的日子可能已经屈指可数了,JavaFX 将是一个更好的起点(如果不是 html5),你尝试双缓冲是错误的:P(对于 awt 和 Swing) 显示你的教授Why CS teachers should stop teaching Java Applets。您正在学习实际上应该避免的材料。说“如果你知道 AWT,你就可以学习 Swing 和所有取代它的东西”就像说“较新的框架不包含任何新东西”,这是错误的。你真的应该避免使用过时的系统。 @Andrew Thompson。谢谢安德鲁!我非常感谢!我会给他看那篇文章。他的反应可能只是滑稽! 【参考方案1】:

它已经到了我不会触及涉及小程序或 AWT 的问题的阶段,直到提出问题的人对他们为什么使用其中任何一个给出了合理的回答。 OTOH,您已经部分实现了这一点,所以这是一个动画球的工作示例。

仔细查看您的代码与此代码之间的差异。

import java.applet.*;
import java.awt.*;

public class TestCanvas extends Applet implements Runnable 

    Panel myPanel = new Panel(new GridLayout());
    int x = 0;
    int y = 0;
    int width = 100;
    int height = 100;
    boolean startBall = false;
    myCanvas canvas = new myCanvas();
    Thread t;

    public void init() 
        myPanel.add(canvas);
        System.out.println("" + this.getLayout());
        /* A Single component added to a no args GridLayout will be stretched 
         to fill the avilable space. */
        this.setLayout(new GridLayout());
        add(myPanel);
        t = new Thread(this);
        t.start();
    

    public void start() 
        t = new Thread();
        t.start();
        startBall = true;
    

    public void stop() 
        t = null;
    

    public void destroy() 
        t = null;
    

    public void run() 
        for (;;) 
            try 
                canvas.repaint();
                Thread.sleep(100);
             catch (InterruptedException e) 
            
        
    

    class myCanvas extends Canvas 

        private static final long serialVersionUID = 1L;

        public myCanvas() 
            setBackground(Color.yellow);
        

        @Override
        public void paint(Graphics g) 
            super.paint(g);
            g.clearRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.black);
            x++;
            y++;
            g.setColor(Color.black);
            g.fillOval(x, y, width, height);
        
    

【讨论】:

如果它有助于解决问题,请accept the answer。

以上是关于在画布上看不到圆圈的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 clearRect 不在画布上绘制移动对象

清除画布矩形(但保留背景)

你如何在 tkinter 画布上创建一个按钮?

在较小的屏幕尺寸上,在 HTML 画布上呈现的图像质量很差

分组形状上的硬币旋转效果动画

画布圆圈绘制不一致