为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁华开满天机 2022-06-23 16:47:26
所以我尝试了 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 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

找到了我的空问题的解决方案。我修改了方法“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();

    }


}

谢谢你的帮助


查看完整回答
反对 回复 2022-06-23
?
当年话下

TA贡献1890条经验 获得超9个赞

你应该把所有的画都画在

public void paintComponent(Graphics g)

方法如https://docs.oracle.com/javase/tutorial/uiswing/painting/problems.html所述。


查看完整回答
反对 回复 2022-06-23
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

使用回调函数。比polling物业好很多。你得到一个新的图形对象。并且您的调用是在适当的上下文中执行的。


这是一般的想法:


实例化

new Gui((Graphics graphics)-> {

   // your code here

});

CTOR 或初始化函数

public Gui(GraphicsCallback callback) 

调用

调用回调。您可以检查是否被调用,如果适合您的用例,则仅回调一次。或者回调实现可以管理多次调用。


public void paintComponent(Graphics g) 

{

    super.paintComponent(g);

    this.g = g;

    this.callback(g)


查看完整回答
反对 回复 2022-06-23
  • 3 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信