Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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绘图时,图形不显示任何内容_Java_Swing_Graphics_Paintcomponent_Repaint - Fatal编程技术网

尝试用java绘图时,图形不显示任何内容

尝试用java绘图时,图形不显示任何内容,java,swing,graphics,paintcomponent,repaint,Java,Swing,Graphics,Paintcomponent,Repaint,这是我的项目中最小的SSCCE,我可以实现给您看。 有人能解释为什么我在渲染中创建的正方形没有显示出来吗 我感谢任何帮助,这非常重要 这段代码是可编译的,并且可以运行,但正如我所说的,它没有显示正方形 循环类 主类 MyPanel类 导入java.awt.Dimension; 导入java.awt.Graphics; 导入java.awt.Graphics2D; 导入java.awt.RenderingHints; 导入java.awt.image.buffereImage; 导入javax.s

这是我的项目中最小的SSCCE,我可以实现给您看。 有人能解释为什么我在
渲染中创建的正方形没有显示出来吗

我感谢任何帮助,这非常重要

这段代码是可编译的,并且可以运行,但正如我所说的,它没有显示正方形

循环类

主类

MyPanel类

导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.RenderingHints;
导入java.awt.image.buffereImage;
导入javax.swing.JPanel;
公共类MyPanel扩展JPanel实现Runnable{
私有静态最终长serialVersionUID=1L;
//线程和循环
私有线程;
私有布尔运行;
私人整数FPS=60;
专用长目标时间=1000/FPS;
私人长期启动;
私事早已过去;
私人长时间等待;
//形象
公共缓存图像;
//福
私人富福;
private Render=Render.getRenderManager实例();
公共事务委员会(){
setPreferredSize(新尺寸(700700));
设置聚焦(真);
requestFocus();
}
public void addNotify(){
super.addNotify();
如果(线程==null){
线程=新线程(此);
thread.start();
}
}
//防止做所有的方法。
私有同步void initGraphic(){
图像=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
foo=新的foo();
运行=真;
}
公开募捐{
initGraphic();
//环路
(跑步时){
start=System.nanoTime();
update();
重新油漆();
已用=System.nanoTime()-开始;
等待=(targetTime-已用时间/1000000)-8;

如果(等待您没有将
图像添加到MyPanel。您需要添加它。在
initGraphic
中,执行以下操作:

private synchronized void initGraphic() {
    image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    this.add(image);  //New.
    foo = new Foo();
    running = true;

}
两个问题:

image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
此时检查
WIDTH
HEIGHT
的值。我认为它们不是您期望的值。这可能是在实现组件之前调用的

public void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);
    graphics = image.getGraphics();
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    render.setRenderState((Graphics2D) graphics);
}
您正在绘制图像,但从未将图像本身绘制到组件上。请保留对原始组件图形对象的引用,然后在最后将该引用绘制到组件上

public void paintComponent(Graphics panelG2d) {
    super.paintComponent(panelG2d);

    Graphics2D imageG2d = (Graphics2D) image.getGraphics();

    imageG2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    imageG2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    render.setRenderState(imageG2d);

    panelG2d.drawImage(image, 0, 0, this);
}

我同意对宽度和高度的误解,我刚刚纠正了它,我不明白你回答的第二部分,你能说得更清楚吗?,“谢谢你,@Wiskyspidergod保佑你,这是我与这件事斗争的一天,我应该再打一个电话给dispose()绘制后?还是绘制组件会自行销毁资源@whiskeyspider@CiMat仅
dispose()
仅处理从
getGraphics()
createGraphics()
获取的图形对象。不要处理传递到
paintComponent()中的图形对象
。哦,如果所有图形都保留在
paintComponent()中,@wiskyspider
private synchronized void initGraphic() {
    image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    this.add(image);  //New.
    foo = new Foo();
    running = true;

}
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
public void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);
    graphics = image.getGraphics();
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    render.setRenderState((Graphics2D) graphics);
}
public void paintComponent(Graphics panelG2d) {
    super.paintComponent(panelG2d);

    Graphics2D imageG2d = (Graphics2D) image.getGraphics();

    imageG2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    imageG2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    render.setRenderState(imageG2d);

    panelG2d.drawImage(image, 0, 0, this);
}