重绘方法不调用paint方法

时间:2017-10-02 17:40:14

标签: java swing

尝试使用paint创建一个矩形但重绘方法不调用paint方法。

甚至尝试用paintComponent替换paint,但仍然无效。 那么要做些什么改变才能使其发挥作用。 在运行中调用重绘方法有问题。

该实例存在问题。

尝试使用paint创建一个矩形但重绘方法不调用paint方法。

甚至尝试用paintComponent替换paint,但仍然无效。 那么要做些什么改变才能使其发挥作用。 在运行中调用重绘方法有问题。

该实例存在问题。

package src;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;


public class main extends JFrame implements Runnable{

private final int Height = 480;
private final int Width = 640;
Thread gameloop; 

public static main instance = null;

private main(){

    JFrame frame = new JFrame();
    frame.setSize(this.Width,this.Height);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static main getInstance(){

    if (instance == null){

        instance = new main();}
    return instance;
}

private void start(){

    gameloop = new Thread(this);
    gameloop.start();

}


@Override
public void paint(Graphics g){

    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(g2d.getBackground());
    g2d.fillRect(0, 0, instance.Width, instance.Height);
    g2d.setColor(Color.red);
    g2d.fillRect(0, 0, 50, 50);

}


@Override
public void run() {

    Thread current = Thread.currentThread();
    while (gameloop == current){
        try{
            Thread.sleep(5);
        }

        catch (InterruptedException e){
            e.printStackTrace();
        }

        repaint();
    }

}



  public static void main(String[] args){

      main.getInstance();

      main.getInstance().start();
}

}

1 个答案:

答案 0 :(得分:0)

最初的问题是你在构造函数中创建了一个新的JFrame然后使其可见,而不是使用你刚创建的main实例,所以main类中没有任何内容实际显示在你的应用程序中,只是一个什么都不做的空白JFrame。你的run循环也毫无意义。

但是,您的代码在逻辑和样式方面都存在很多的其他问题。我建议你重构一切。这是一个更清洁的版本,也可以解决您的问题。

package src;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;


public final class Main extends JFrame implements Runnable {
    private volatile boolean running;

    private Main(int width, int height) {
        setSize(width, height);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void start() {
        running = true;
        new Thread(this).start();
    }

    private void stop() {
        running = false;
    }

    @Override
    public void paintComponent(Graphics g){
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(g2d.getBackground());
        g2d.fillRect(0, 0, getWidth(), getHeight());
        g2d.setColor(Color.red);
        g2d.fillRect(0, 0, 50, 50);
    }

    @Override
    public void run() {
        while (running) {
            try {
                Thread.sleep(40);
            }
            catch (InterruptedException e){
                e.printStackTrace();
            }
            repaint();
        }
    }

    public static void main(String[] args) {
        new Main(640, 480).start();
    }
}