当前位置: 首页 > 知识库问答 >
问题:

Graphics2D不在画布上绘制

仇和蔼
2023-03-14
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个答案

怀飞扬
2023-03-14

您的大多数代码都非常接近于实现您试图实现的目标。只是组织有点不正常,类实例的创建有点混乱。

一般来说,最好不要将Java Swing元素(JFrames)与AWT元素(Canvas)混合。我真的不知道您使用BufferStrategy背后的动机是什么。此外,处理Java Swing组件及其对paintComponent的奇怪的零星调用可能是游戏开发的一个痛苦。

您可能不得不切换到Swing并使用线程,因为这将是一个更干净的解决方案。如果你正在制作的游戏是相对图形密集型的,你会想要使用OpenGL,或者更好的使用OpenGL之上的包装器库,比如LWJGL或者我最喜欢的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();
    }  
}
 类似资料:
  • 5.2.3 在画布上绘图 本节介绍如何在画布上绘制图形。为了完整起见,我们将前面介绍过的首先需要执行的 几条语句合在一起复制如下: >>> from Tkinter import * >>> root = Tk() >>> c = Canvas(root,width=300,height=200,bg='white') >>> c.pack() 如前所述,c 是一个画布对象,而画布对象提供了若干

  • 十七、在画布上绘图 绘图就是欺骗。 M.C. Escher,由 Bruno Ernst 在《The Magic Mirror of M.C. Escher》中引用 浏览器为我们提供了多种绘图方式。最简单的方式是用样式来规定普通 DOM 对象的位置和颜色。就像在上一章中那个游戏展示的,我们可以使用这种方式实现很多功能。我们可以为节点添加半透明的背景图片,来获得我们希望的节点外观。我们也可以使用tra

  • 我想在画布上画一段视频。为了实现这一点,我在Javascript中捕获onMouseDown和onMouseUp事件,以获得每个事件的x和y坐标(我需要在画布中设置视频的位置、宽度和高度)。 因此,每次我在画布上绘制视频时,我创建的上一个视频都应该停止,并且必须播放新的视频。两个问题: 1)视频不播放(功能只画第一帧),但他的音频可以 2) 如何停止以前绘制的视频? 演示:http://jsfid

  • 我试图编写一个SWT组件,它能够采取和绘制的实例。我的问题是SWT的和AWT的不兼容:SWT组件不能绘制,AWT/Swing组件不能绘制。 有几种方法试图以其他方式解决这个问题(也可能有一些变化,但基本上有以下两种): 在SWT图像和AWT BuffereImage之间转换 他们都有缺点,没有满足我的期望: 第一种方法是将SWT转换为,由于为每个像素创建了一个新的实例,因此对大图像的性能较差 第二

  • 问题内容: 是否有将SVG文件绘制到HTML5画布上的默认方法?GoogleChrome支持将SVG加载为图像(并简单地使用),但是开发者控制台会对此进行警告。 我知道将SVG转换为canvas命令的可能性,但是我希望这不是必需的。我不在乎较旧的浏览器(因此,如果FireFox 4和IE 9支持某些功能,那就足够了)。 问题答案: 编辑2019年12月16日 现在所有主要浏览器都支持Path2D

  • 实际上,我可以使用函数来完成。我从“HTML5画布-如何在图像背景上画一条线?”中得到的东西。但是我需要在不使用from函数的情况下绘制图像,如下所示: