Java 程序流程

Java Program flow

我已经在 python 编程了一段时间并且一直有兴趣学习 Java 一段时间所以我想我会试一试所以怜悯我知道这是一个目前无限循环,请谨慎行事。

import javax.swing.*;
import java.awt.*;

public class snake extends JFrame{
    public static void main(String[] args) {
        JFrame screen = new JFrame("Snake");
        screen.setSize(640, 480);
        screen.setResizable(false);
        screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container pane = screen.getContentPane();
        screen.setVisible(true);
        while(true) {
            pane.add(new Render());
        }
    }

}
class Render extends JComponent {
    Render(){
    }
    public void paint(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0,0,640,480);
        g.setColor(Color.green);
        g.fillRect(100,100,25,25);      
    }   
}

我目前这个小程序的目标是循环我的代码,这样每次我的 while 循环迭代时,我都希望代码流能够更新屏幕并重绘任何东西,以便将来矩形可以移动。从我的测试中我已经 运行 循环的第一次迭代运行在我的 Render class 内部的方法然后之后它停留在(我相信这是 [=21= 中的构造函数])

Render() {
}

code.where 的一部分,它在每次迭代中循环,我希望它如何用于该方法。我试图从构造函数内部调用该方法,但没有成功。我如何路由程序的流程,以便程序的每次循环迭代都通过该方法?谢谢你的时间。

首先查看 Painting in AWT and Swing and Performing Custom Painting 以了解有关如何在 Swing 中绘画的更多详细信息...

这个...

while(true) {
    pane.add(new Render());
}

会引起问题。如果它不阻塞事件调度线程,它会运行 快到导致其他线程停止(或 运行 更慢)并且简单地不断添加新的 Render 实例到pane,我敢肯定你不想要。

通常鼓励覆盖 paintComponent 而不是 paint,因为它可以减少问题。按照惯例,您还应该在进行任何自定义绘画之前致电 super.paintComponent

相反,只需创建 Render 的实例并将其添加到框架

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Snake {

    public static void main(String[] args) {
        new Snake();
    }

    public Snake() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Render());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    class Render extends JComponent {

        Render() {
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.white);
            g.fillRect(0, 0, 640, 480);
            g.setColor(Color.green);
            g.fillRect(100, 100, 25, 25);
        }
    }
}

您可能想要执行一些动画,请查看 Concurrency in Swing and How to use Swing Timers 了解更多详细信息

对于example