Graphics2D无法在Canvas上绘制

时间:2018-07-23 17:40:54

标签: java swing graphics2d

我正在制作一个游戏,在该游戏中,需要按照一系列程序(而不是每帧连续进行)更新屏幕,并且我制作了一个较小的程序来测试Graphics2D绘图。在此程序中,我要做的就是在角落绘制一个小矩形。但是,矩形似乎没有绘制。我不确定是否误解了BufferStrategy的用法(即,有一种更好的方式可以以此方式更新游戏),但是我尝试两次调用draw方法以确保graphics2D对象存在并且不为null。 / p>

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import javax.swing.*;

public class test extends Canvas
{
    private JFrame testWindow = new JFrame("Test");

    public test()
    {
        createUI();
    }

    public static void main(String[] args)
    {
        new test();
    }

    public void createUI()
    {
        testWindow.setSize(500,500);
        testWindow.setLayout(null);
        testWindow.setLocationRelativeTo(null);
        testWindow.setResizable(false);
        testWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        testWindow.add(this);

        testWindow.setVisible(true);

        draw();
        draw();
    }

    public void draw()
    {
        BufferStrategy bs = this.getBufferStrategy();
        System.out.println(bs); 
        //when the program runs this prints null once and then an identifier
        if(bs == null)
        {
            this.createBufferStrategy(3);
            return;
        }

        Graphics g = bs.getDrawGraphics();
        Graphics2D g2 = (Graphics2D) g;

        g2.setColor(Color.RED);
        g2.fillRect(10,10,100,100);

        g2.dispose();
        bs.show();
    }
}

1 个答案:

答案 0 :(得分:2)

善良

大多数代码都非常接近您要完成的任务。只是组织有点差,您创建的类实例有点混乱。

坏人

通常,最好不要将Java Swing元素(JFrames)与AWT元素(Canvas)混合使用。而且我真的不知道您使用BufferStrategy的动机是什么。而且,处理Java Swing组件及其对paintComponent的怪异零星调用可能会给游戏开发带来痛苦。

丑陋

您可能将不得不切换到Swing并使用线程,因为这将是一种更干净的解决方案。而且,如果您要制作的游戏甚至需要大量图形,那么您将希望使用OpenGL或更高版本,例如LWJGL或我最喜欢的{{3} }。

但是暂时,这是一个工作示例,例如您尝试使用LibGDX制作的示例:

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class Test {
    private static JFrame testWindow;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createUI(); 
            }
        });
    }

    private static void createUI() {
        testWindow = new JFrame("Test");
        testWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        testWindow.add(new MyPanel());
        testWindow.pack();
        testWindow.setVisible(true);

    }
}

class MyPanel extends JPanel {

    public MyPanel() {
        setBorder(BorderFactory.createLineBorder(Color.black));
    }

    public Dimension getPreferredSize() {
        return new Dimension(500,500);
    }

    public void paintComponent(Graphics g) {     
        super.paintComponent(g);       
        Graphics2D g2 = (Graphics2D) g;

        g2.setColor(Color.RED);
        g2.fillRect(10,10,100,100);

        g2.dispose();
    }  
}

如果您有任何疑问,请告诉我。

注意:类名应始终大写。