Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java repaint()不再工作_Java_Swing_2d_Rendering - Fatal编程技术网

Java repaint()不再工作

Java repaint()不再工作,java,swing,2d,rendering,Java,Swing,2d,Rendering,我目前正在学习java,并试图通过JPanel在JFrame上绘图 问题是,我的渲染代码运行正常,但我已经做了一些细微的更改,现在重新绘制方法将不再刷新JPanel 我在每个方法中都有System.out.println调用,但我的控制台如下所示: 渲染 提供 提供 渲染 ,当我调用render方法时。它以前是工作的。。。。 不管怎样,这是我的代码 package Graphics; import java.awt.Color; import java.awt.Graphics; import

我目前正在学习java,并试图通过JPanel在JFrame上绘图

问题是,我的渲染代码运行正常,但我已经做了一些细微的更改,现在重新绘制方法将不再刷新JPanel

我在每个方法中都有System.out.println调用,但我的控制台如下所示:

渲染 提供 提供 渲染

,当我调用render方法时。它以前是工作的。。。。 不管怎样,这是我的代码

package Graphics;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Surface extends JPanel {

    JFrame frame;
    RandomFrame rf;

    public Surface(JFrame frame) {
        this.frame = frame;
        rf = new RandomFrame(frame.getWidth(), frame.getHeight());
    }

private void draw(Graphics g) {

    Graphics2D g2d = (Graphics2D) g;

    g2d.setPaint(Color.blue);

    int w = getWidth();
    int h = getHeight();

    g2d.drawImage(rf.getRandom(w, h), null, 0, 0);
    System.out.println("draw");
}

@Override
public void paintComponent(Graphics g) {
    System.out.println("paintComponent");
    super.paintComponents(g);
    draw(g);
}

public void render() {
    System.out.println("render");
    repaint();
}

}

,而RandomFrame返回带有随机数据的BuffereImage。

在获取帧的曲面构造函数中,确保将SurfacePanel添加到帧中。比如说

公共表面框架{ this.frame=frame; frame.setContentPanethis;//添加此行 rf=新的RandomFrameframe.getWidth,frame.getHeight; }

如果将渲染输出到控制台,则问题可能在于RandomFrame或您正在更新的曲面实例不是屏幕上的实例。考虑提供一个说明你的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应您是否可能在事件调度线程中运行的循环中调用render?在重新绘制经理有机会完成其工作之前,绘制不会发生,而edt中的循环将阻止绘制。因此,在这种情况下,只有在从edt中运行的代码返回后才能进行绘制,在无限循环的情况下,决不进行绘制。请尝试在调用器内调用repaint。。来自SwingUtilities@Terjerepaint是Swing中为数不多的线程安全方法之一,它将请求委托给RepaintManager,后者将事件发布到EventQueue上,然后由EDT处理……请忽略我的评论。整个gui在另一个自定义线程上运行,这是一个极端情况。