这是我问题的简单版本。我有3个类:公共类TopographyFrame扩展JFrame-带JPAnel的简单JFrame和按钮公共类TopographyPanel扩展JPAnel-JPAnel以填充矩形公共类Siec-类执行计算并调用JPAnale上的重新绘制
在JPanel中,我概述了paintComponent()方法
public void paintComponent (Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
System.out.println(rectangles.length);
for(int i = 0 ; i < rectangles.length ; i++){
g2.setPaint(neurony[i].winner);
g2.fillRect((int)rectangles[i].x,(int)rectangles[i].y,(int)rectangles[i].width, (int)rectangles[i].height);
}
}
Neurony-具有字段公共颜色获胜者的对象数组
在Siec类中,我引用JPanel在JFrame类中重新绘制它,我有一个带有私人动作侦听器的按钮:
class MyListener implements ActionListener{
Siec s;
public MyListener(Siec s){
this.s = s;
}
public void actionPerformed(ActionEvent arg0) {
try {
s.forPaint();
} catch (Exception e) {
e.printStackTrace();
}
}
Siec中的方法forPaint()如下所示:
public void forPaint(){
setTopography();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setTopography();
}
public void setTopography() {
for (int i = 0; i < vector.colors.length; i++) {
neurony[i].winner = vector.colors[(int)(random() * 900 % vector.colors.length)];
}
panel.repaint();
}
矢量。颜色是颜色的数组
所以我的问题是:当我点击一个按钮时,我想立即重新绘制,然后在3秒钟后重新绘制一次。Insted JPanel在3s延迟后仅重新绘制一次。}
由于睡眠是在事件调度线程上执行的,因此在等待结束之前无法执行repaint()事件。改为:
private Timer timer = new Timer(); // use java.util.Timer
public void forPaint() {
setTopography();
timer.schedule(new TimerTask() {
@Override
public void run() {
setTopography();
}
}, 3000);
}
public void setTopography() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
for (int i = 0; i < vector.colors.length; i++) {
neurony[i].winner = vector.colors[(int)(random() * 900 % vector.colors.length)];
}
panel.repaint();
}
});
}
请记住,对Swing组件(例如您的JPanel)的所有修改都必须在EDT上进行。
您正在调度UI线程上的重新绘制,然后将UI线程Hibernate(阻塞)3秒,然后再次请求另一次重新绘制。这两种情况要么在该方法完成后(3秒后)非常接近,要么合并到一个更新中(之后也是如此)。您可以计划在3秒后在UI线程上调用setTopology,而不是再次调用setTopology。
看一看摆动计时器,例如:http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html
因此,大致如下:
javax.swing.Timer timer = new javax.swing.Timer(3000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
setTopography();
}
});
timer.setRepeats(false);
timer.start();
你永远不能在事件处理线程上睡眠、等待或以其他方式暂停。这样做会阻止处理所有事件,包括绘制事件。你的第一幅画无法出现,因为你睡在事件线程上,阻止了它的发生。
制作任何类型动画的正确方法——甚至像这样简单的事情——是创建自己的线程。第二个线程可以调用repaint(),Hibernate3秒,然后再次调用repaint()。SwingWorker类名义上是一种更简单的方法,但老实说,初学者总是发现创建自己的线程更容易。
问题内容: 我有Visio2007,我真的很喜欢。但是,它似乎没有Java的UML模型/数据类型。我可以为Java下载一些模板吗?还是我应该完全忘记Visio并获得一个Elipse插件? 谢谢! 问题答案: 后者是更好的选择,恕我直言。此外,我认为UML模型不应该特定于Java。我不知道周围是否有特定于Java的UML。 我在网上搜索时发现了这个。UML模型:MS Visio 2007。
问题内容: 嗨,我在Java中有一个绘制矩形的代码,但是它只会向右拖动,即使我向左拖动,也会向右拖动,这是代码对我有帮助吗? 问题答案: 请记住,(和和)不会渲染宽度/高度为负的矩形 你需要两件事… 当前鼠标点(或您的情况下的拖动点) 首次按下鼠标的点(锚点或原点) 您应该从事件中获取锚点… 然后,您需要确定哪个点最小,并将其作为起点,哪个点最大,并将其用于尺寸。
问题内容: 我有一个接口,我想在进行快速Google搜索后在单独的类中实现,显然Java没有局部类。有没有办法做到这一点,还是我将所有代码都扔进一个类中? 基本上,我正在尝试编写服务。有些服务方法实际上属于它们自己的类,并且在同一类中似乎是不合逻辑的。这是我正在尝试做的一个例子。 我通常会在C#中使用局部类,并且会使用类似的方法将相似的值返回到一个局部类中(或者可能在一个类中更新记录的类)。我将如
-在if语句中输入图像描述错误
问题内容: 我正在学习使用装饰器模式,但遇到一个我认为很简单但似乎找不到答案的问题。假设我有一个抽象的饮料类。然后,让我们说一下扩展饮料的一些具体组成部分:美式咖啡,浓缩咖啡,拿铁咖啡等。还有扩展饮料的抽象调味品类。然后,调味品类有多个子类:牛奶,糖,大豆,鞭子。每个调味品子类都有一个cost和getdescription()方法,分别从Beverage和Condiments继承。我的问题是,如何
我正在学习使用decorator模式,我遇到了一个问题,我认为这个问题很简单,但我似乎找不到答案。假设我有一个饮料课是抽象的。然后让我们假设我有几个具体的成分延伸饮料:美式咖啡,浓缩咖啡,拿铁等等,还有一个抽象的调味品类延伸饮料。调味品类又有多个子类:牛奶、糖、大豆、鞭。每个调味品子类都有一个cost和getdescription()方法,分别继承自Beverage和addinments。我的问题