所以我尝试了java.awt.Graphics库,并在我的代码中遇到了一个问题。下面的代码返回空指针异常,因为在执行时未定义Graphics对象“ g”。我可以循环调用并检查g!= null,但是有更好的方法吗?
感谢您的帮助。
这是我的代码:
package gui;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Gui extends JPanel{
Graphics g;
public Gui()
{
JFrame frame = new JFrame("test");
frame.setSize(700, 700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(this);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
this.g = g;
g.setColor(Color.blue);
for(int x = 0;x < 700; x += 20)
{
g.drawLine(x, 0, x, 700);
}
for(int y = 0;y < 700; y += 20)
{
g.drawLine(0, y, 700, y);
}
}
public void draw(Tuple xy)
{
g.setColor(Color.blue); // <--- null pointer exception
g.fillOval(xy.x, xy.y, 5, 5);
}
}
和主要班级:
package gui;
public class Main {
public static void main(String[] args)
{
new Gui().draw(new Tuple(200,200)); //Tuple is a custom class I wrote
}
}
答案 0 :(得分:2)
找到了解决我的空问题的方法。我修改了方法“ draw()”以接受一个元组,然后将其传递给paintComponent()函数并调用repaint()。
package gui;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Gui extends JPanel{
Graphics g;
Tuple xy;
public Gui()
{
JFrame frame = new JFrame("test");
frame.setSize(700, 700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.add(this);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
this.g = g;
g.setColor(Color.blue);
for(int x = 0;x < 700; x += 20)
{
g.drawLine(x, 0, x, 700);
}
for(int y = 0;y < 700; y += 20)
{
g.drawLine(0, y, 700, y);
}
if(xy != null)
{
g.fillOval(xy.x, xy.y, 5, 5);
}
}
public void draw(Tuple xy)
{
this.xy = xy;
repaint();
}
}
感谢您的帮助
答案 1 :(得分:1)
您应该在
上绘制所有图纸public void paintComponent(Graphics g)
https://docs.oracle.com/javase/tutorial/uiswing/painting/problems.html中所述的方法。
答案 2 :(得分:-1)
使用回调函数。比polling
属性好得多。您将获得一个新的图形对象。并且您的呼叫将在适当的上下文中执行。
这是一般想法:
new Gui((Graphics graphics)-> {
// your code here
});
public Gui(GraphicsCallback callback)
调用回调。您可以检查是否已调用,并且仅在适合您的用例的情况下回调一次。或者,回调实现可以管理被调用的时间。
public void paintComponent(Graphics g)
{
super.paintComponent(g);
this.g = g;
this.callback(g)