我正在尝试建立一个小的库以供其他项目使用,这有助于设置一个帧,该帧的图像每秒重绘X次。
它包含两个类:
package displayKit;
public class Runtime
{
public Display display;
static double lastTime;
static double thisTime;
public static double deltaT;
static double lastShortTime;
public static Thread thread;
public int FPS = 50;
public static boolean running = false;
public Runtime(int w, int h)
{
display = new Display(w, h);
lastTime = System.currentTimeMillis();
lastShortTime = System.currentTimeMillis();
running = true;
while(running)
{
OnUpdate();
}
}
void OnUpdate()
{
deltaT = (System.currentTimeMillis()-lastShortTime)/1000;
lastShortTime = System.currentTimeMillis();
while(AssessTime(FPS))
{
if(display != null)
{
//Where I've been putting the code that works
display.repaint();
}
}
}
public static boolean AssessTime(int FPS)
{
...irrelevant...
}
}
和:
package displayKit;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Display extends JPanel
{
private static final long serialVersionUID = 1L;
public static int width;
public static int height;
public static Dimension dimension;
public static JFrame frame;
public static JPanel panel;
public BufferedImage image;
public Runtime runtime;
public Display(int w, int h)
{
width = w;
height = h;
dimension = new Dimension(width, height);
frame = buildJFrame(w, h);
}
public JFrame buildJFrame(int w, int h)
{
JFrame frame = new JFrame();
frame.setSize(dimension);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
panel = this;
panel.setPreferredSize(dimension);
panel.setSize(dimension);
panel.setMaximumSize(dimension);
panel.setMinimumSize(dimension);
frame.add(panel);
frame.setVisible(true);
frame.pack();
image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
return frame;
}
public void paintComponent(Graphics g)
{
g.setColor(Color.black);
g.fillRect(0, 0, width, height);
g.drawImage(image, 0, 0, null);
g.dispose();
}
public static BufferedImage ColorNoise(int w, int h)
{
...irrelevant...
}
}
我正在尝试在其他地方(在另一个程序包中)创建Runtime的实例,然后修改Display的变量'image',以使渲染的图像可以在该上下文中动态且简单地更改。我有一个功能可以制作一个充满噪声的缓冲图像以进行测试,当我在OnUpdate()中将Display的“图像”设置为此时,它可以工作...
但是,当我尝试在其他地方执行此操作时,即(伪代码):
public void main(String args[])
{
Runtime runtime = new Runtime(...)
while(true)
{
runtime.display.image = (randomly generated image)
}
}
当我在OnUpdate()中有代码时,如第一个类中所述,它可以工作并且每帧都会有噪声更新,但是当我尝试在其他位置执行此操作时,不会抛出错误,JFrame只会保持黑色。我觉得我的代码结构错了,但是我不知道如何使它足够灵活以用于几个不同的项目。
感谢您的帮助,对不起我的白痴!
[好吧,我假设JFrame
在您明确调用repaint
之前不会绘制任何图像。
它在OnUpdate
中起作用,因为您在那儿显式调用它,并且给了组件一些时间在循环迭代之间重绘自身。
deltaT = (System.currentTimeMillis()-lastShortTime)/1000;
lastShortTime = System.currentTimeMillis();
while(AssessTime(FPS)) {
. . .
display.repaint();
}
如果仅执行while
循环-您的组件将没有足够的时间重绘自身。
尝试做类似的事情来验证我的假设:
while(true) {
Thread.sleep(50);
runtime.display.image = (randomly generated image)
runtime.display.repaint();
}