Java:访问要渲染的BufferedImage仅在类内部具有作用

问题描述 投票:1回答:1

我正在尝试建立一个小的库以供其他项目使用,这有助于设置一个帧,该帧的图像每秒重绘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只会保持黑色。我觉得我的代码结构错了,但是我不知道如何使它足够灵活以用于几个不同的项目。

感谢您的帮助,对不起我的白痴!

java scope access
1个回答
0
投票

[好吧,我假设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();
}
© www.soinside.com 2019 - 2024. All rights reserved.