Как задержать Java-код, пока не закончится другая часть кода? - PullRequest
0 голосов
/ 17 февраля 2019

, поэтому я пробовал библиотеку java.awt.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 голосов
/ 17 февраля 2019

Используйте функцию обратного вызова.Намного лучше, чем polling собственность.И вы получите свежий графический объект.И ваш вызов выполняется в правильном контексте.

Вот общая идея:

Instantiation

new Gui((Graphics graphics)-> {
   // your code here
});

CTOR или функция Init

public Gui(GraphicsCallback callback) 

Invoke

Вызов обратного вызова.Вы можете проверить, был ли вызван и только один раз, если это соответствует вашему варианту использования.Или реализация обратного вызова может управлять вызовом несколько раз.

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    this.g = g;
    this.callback(g)
0 голосов
/ 18 февраля 2019

Нашел решение моей нулевой проблемы.Я изменил метод 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();
    }

}

Спасибо за помощь

0 голосов
/ 17 февраля 2019

Вы должны сделать все рисование по методу

public void paintComponent(Graphics g) 

, как указано в https://docs.oracle.com/javase/tutorial/uiswing/painting/problems.html.

...