Graphics2D 未在 Canvas 上绘图
Graphics2D not drawing on Canvas
我正在制作一个游戏,其中屏幕需要在一组程序(不是连续每一帧)后更新,我制作了一个较小的程序来测试 Graphics2D 绘图。在这个程序中,我只想在角落里画一个小矩形。但是,矩形似乎没有绘制。我不确定我是否误解了 BufferStrategy 的使用(即有更好的方法以这种方式更新游戏),但我尝试调用 draw 方法两次以确保 graphics2D 对象存在并且不为空。
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();
}
}
好的
你们中的大多数代码都非常接近于实现您想要完成的目标。只是组织有点不对,你创建的class个实例有点乱。
坏人
一般来说,最好不要混合 Java Swing 元素 (JFrames) with AWT elements (Canvas)。而且我真的不知道您使用 BufferStrategy 的动机是什么。此外,处理 Java Swing 组件及其对 paintComponent 的怪异零星调用可能会给游戏开发带来痛苦。
丑陋的
您可能不得不切换到 Swing 并使用线程,因为这将是一个更干净的解决方案。如果您正在制作的游戏相对图形密集,您将需要使用 OpenGL or better yet, a wrapper library over OpenGL, like LWJGL or my favorite, LibGDX.
但目前,这里有一个工作示例,就像您尝试使用 Oracle's Custom Painting Tutorial:
制作的示例一样
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();
}
}
如果您有任何问题,请告诉我。
注意:Class 名称应始终大写。
我正在制作一个游戏,其中屏幕需要在一组程序(不是连续每一帧)后更新,我制作了一个较小的程序来测试 Graphics2D 绘图。在这个程序中,我只想在角落里画一个小矩形。但是,矩形似乎没有绘制。我不确定我是否误解了 BufferStrategy 的使用(即有更好的方法以这种方式更新游戏),但我尝试调用 draw 方法两次以确保 graphics2D 对象存在并且不为空。
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();
}
}
好的
你们中的大多数代码都非常接近于实现您想要完成的目标。只是组织有点不对,你创建的class个实例有点乱。
坏人
一般来说,最好不要混合 Java Swing 元素 (JFrames) with AWT elements (Canvas)。而且我真的不知道您使用 BufferStrategy 的动机是什么。此外,处理 Java Swing 组件及其对 paintComponent 的怪异零星调用可能会给游戏开发带来痛苦。
丑陋的
您可能不得不切换到 Swing 并使用线程,因为这将是一个更干净的解决方案。如果您正在制作的游戏相对图形密集,您将需要使用 OpenGL or better yet, a wrapper library over OpenGL, like LWJGL or my favorite, LibGDX.
但目前,这里有一个工作示例,就像您尝试使用 Oracle's Custom Painting Tutorial:
制作的示例一样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();
}
}
如果您有任何问题,请告诉我。
注意:Class 名称应始终大写。