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

延迟在Java图形中不起作用

籍利
2023-03-14
问题内容

这是用于通过布雷森纳姆算法在计算出的位置上绘制点的代码:

public void drawBresenhamPoints(Graphics2D g2, List<Point> bresenham) throws InterruptedException
{
       Graphics2D g = (Graphics2D) g2;

    if(bresenham == null)
        return;

    g.setColor(Color.DARK_GRAY);

    for(int i = 0; i < bresenham.size(); i = i+20)
    {
        int x = bresenham.get(i).x - pointWidth1/2;
        int y = bresenham.get(i).y - pointWidth1/2;

        int ovalW = pointWidth1;
        int ovalH = pointWidth1;

        g.fillOval(x, y, ovalW, ovalH);

            // delay
         try 
         {
             Thread.sleep(10);
         } 
         catch(Throwable e) 
         {
         System.out.println(e.getMessage()); 
         }
    }
}

列表“布雷森汉姆”包含所有借助布雷森汉姆线描算法预先计算的点。我想在“
for”循环中设置1秒的延迟,以便在间隔1秒后绘制每个点。“延迟”部分中列出的部分无效。如何使“延迟”工作?更具体地说,我想看到所有的点以1秒的间隔在屏幕上一个接一个地绘制。


问题答案:

我假设您正在某个paint/paintComponent方法中调用此方法。

只是一个提示: 从来没有睡过油漆过程

而是将a
javax.swing.Timer用于重复任务。什么
会做的是

  • 有两个Lists。你List<Point> bresenham和另一个List<Point> paintList。该bresenham会握住你的数据,并且paintList将初始为空。

  • paintList画你的观点

        @override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;

        for (Point p : paintList) {
            int x = bresenham.get(i).x - pointWidth1/2;
            int y = bresenham.get(i).y - pointWidth1/2;

            int ovalW = pointWidth1;
            int ovalH = pointWidth1;

            g.fillOval(x, y, ovalW, ovalH);
        }
    }
  • 尽管最初没有任何内容paintList,但您会Point在每次触发计时器事件时将一个新值添加到列表中。
        Timer timer = new Timer(100, new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            if (bresenham.isEmpty()) {
                ((Timer)e.getSource()).stop();
            } else {
                paintList.add(bresemham.get(0));
                bresenham.remove(0);
            }
            repaint();  
        }
    });
    timer.start();

构造函数的基本计时器为firs the delay,它是 “ iterations”
和侦听器中第二个参数之间的延迟时间,该参数实际上侦听每delay毫秒触发的计时器事件。那么上面的代码通常做的就是添加PointpaintList取自bresenham列表,然后删除的项目repaint,其调用paintComponent。当列表为空时,计时器将停止。

更新

这是一个完整的运行示例

    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.Timer;

    public class BresenhamPoints extends JPanel {

        private static final int D_W = 500;
        private static final int D_H = 500;

        private List<Point> bresenhamList;
        private List<Point> paintList;

        public BresenhamPoints() {
            bresenhamList = createRandomPoints();
            paintList = new ArrayList<>();

            Timer timer = new Timer(100, new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (bresenhamList.isEmpty()) {
                        ((Timer) e.getSource()).stop();
                    } else {
                        paintList.add(bresenhamList.get(0));
                        bresenhamList.remove(0);
                    }
                    repaint();
                }
            });
            timer.start();
        }

        private List<Point> createRandomPoints() {
            Random rand = new Random();
            List<Point> list = new ArrayList<>();
            for (int i = 0; i < 100; i++) {
                list.add(new Point(rand.nextInt(D_H), rand.nextInt(D_H)));
            }
            return list;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (Point p : paintList) {
                g.fillOval(p.x - 5, p.y - 5, 10, 10);
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(D_W, D_H);
        }

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new JFrame();
                    frame.add(new BresenhamPoints());
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }


 类似资料:
  • 我使用JPA2.1和Hibernate来实现。 举个示例: 我有一个父实体(称为父实体)和一个子实体(称为子实体)。 可嵌入唯一密钥: 父实体: 子实体: 对于一些关于Parent查询,我需要child,而对于某些情况,我不需要。 我试图通过uniqueKey获取数据,但没有调用getChild(),但它仍然在获取父级数据的同时获取子级数据。 在参考了这个答案之后。它说在@OneToOne的情况下

  • 我尝试在我的机器人上实现一个延迟功能,以一个接一个地显示多条消息。延迟特性显示在我的Flow Bot Builder图表中,但当我在conversation tester和Messenger上的代理Bot中测试时,延迟实际上并没有发生--所有消息都同时显示。 我已经将IDE中的延迟代码添加到default.scr文件中: 我还按照下面的指示将options.apikey代码行添加到index.js

  • 我们正在为我们的android应用程序实现延迟的深度链接,但是当从facebook广告下载时,无法获得安装推荐器。 采取的步骤, 1.从分支创建深度链接。io仪表板= 2.对于在android中的重定向(当应用程序未安装时),web url设置为所需的推荐值。例如https://play.google.com/store/apps/details?id=mypackagename 3.当用户直接点

  • 我正在使用R rticles包中的Elsevier模板在Rstudio中生成pdf文档。对于这篇论文,我想包括一个.png图像。当我加载图像时 工作正常,但当我将其更改为等效的knitr命令时(我更喜欢这个命令,因为它更容易设置fig大小等)。 我得到以下错误: 当我在rmarkdown中切换到pdf的标准输出设置时,输出:pdf_document,knitr选项确实起作用,所以我猜问题一定与rt

  • 问题内容: 因此,在这段代码中: 似乎在FileConverter方法尚未完成调用之前,消息对话框窗口弹出窗口的速度就太快了。我想知道JOptionPane的放置是否正确,或者是否可以将消息延迟到该方法完成处理之前? 问题答案: 您可以使用SwingWorker。 在这里看看Java教程。

  • 问题内容: 我有一个简短的问题,希望有人能帮助我。 请查看以下代码片段: 有人可以帮我解决这个问题吗?我想实现一种类似“工具提示”的行为:您用鼠标输入一个区域。如果鼠标停留在该位置,请执行某些操作。 问题答案: 在您的方法中延迟2秒启动计时器,该计时器将调用您想要执行的任何操作。 设置一个新的处理程序(),如果该计时器尚未关闭,则将其停止。 基本上,您知道如果尚未调用鼠标,鼠标仍会在那里。计时器将