这是用于通过布雷森纳姆算法在计算出的位置上绘制点的代码:
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
毫秒触发的计时器事件。那么上面的代码通常做的就是添加Point
到paintList
取自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秒启动计时器,该计时器将调用您想要执行的任何操作。 设置一个新的处理程序(),如果该计时器尚未关闭,则将其停止。 基本上,您知道如果尚未调用鼠标,鼠标仍会在那里。计时器将