繁体   English   中英

尝试在java中绘制时,图形不显示任何内容

[英]graphics not display anything when trying to draw in java

这是我项目中最小的SSCCE,我可以实现给你看。 任何人都可以解释为什么我在Render创建的正方形没有显示出来?

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

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

循环类

public class Foo {
    public void update() {
    for (int i = 0; i < 20; i++)
        System.out.println("foo");
    }
}

渲染类

import java.awt.Graphics2D;

public class Render {

    private static Render renderManager = new Render();

    public void setRenderState(Graphics2D graphic) {

    showRender(graphic);

    }

    private void showRender(Graphics2D graphic) {
    graphic.fillRect(4, 3, 40, 40);

    }

    public static Render getRenderManagerInstance() {
    return renderManager;
    }
}

主要课程

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class Main {

    private static final Main mainFrame = new Main();
    private final JFrame frame;

    private Main() {
    frame = new JFrame();
    frame.setUndecorated(true);
    frame.add(new MyPanel());
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }

    public static Main getMainFrameInstance() {
    return mainFrame;
    }


    public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
        Main.getMainFrameInstance();
        }
    });
    }

}

MyPanel类

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class MyPanel extends JPanel implements Runnable {

    private static final long serialVersionUID = 1L;

    // thread and loop
    private Thread thread;
    private boolean running;
    private int FPS = 60;
    private long targetTime = 1000 / FPS;
    private long start;
    private long elapsed;
    private long wait;

    // image
    public BufferedImage image;
    // foo
    private Foo foo;

    private Render render = Render.getRenderManagerInstance();

    public MyPanel() {
    setPreferredSize(new Dimension(700, 700));
    setFocusable(true);
    requestFocus();
    }

    public void addNotify() {
    super.addNotify();
    if (thread == null) {
        thread = new Thread(this);
        thread.start();
    }
    }

    // prevent to be done all method.
    private synchronized void initGraphic() {
    image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    foo = new Foo();
    running = true;

    }

    public void run() {
    initGraphic();

    // loop
    while (running) {
        start = System.nanoTime();
        foo.update();
        repaint();
        elapsed = System.nanoTime() - start;
        wait = (targetTime - elapsed / 1000000) - 8;
        if (wait <= 0)
        wait = 6;

        try {
        Thread.sleep(wait);
        } catch (Exception e) {
        e.printStackTrace();
        }

    }
    }

    @Override
    public void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);
    graphics = (Graphics2D) 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);
    }

两个问题:

image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

此时检查WIDTHHEIGHT的值。 我不认为他们是你所期望的。 据推测,这是在组件实现之前调用的。

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);
}

您正在绘制图像,但你永远不会绘制图像本身的组件。 保持对原始组件的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);
}

您不会将image添加到MyPanel。 你需要添加它。 initGraphic执行以下操作:

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM