如何延迟Java代码直到另一部分代码完成?

时间:2019-02-17 03:10:53

标签: java nullpointerexception paintcomponent

所以我尝试了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

}
}

3 个答案:

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

CTOR或Init函数

public Gui(GraphicsCallback callback) 

调用

调用回调。您可以检查是否已调用,并且仅在适合您的用例的情况下回调一次。或者,回调实现可以管理被调用的时间。

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    this.g = g;
    this.callback(g)