gpt4 book ai didi

Java程序流程

转载 作者:行者123 更新时间:2023-12-02 04:48:45 25 4
gpt4 key购买 nike

我已经用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 类内部的方法运行,然后它停留在(我相信这是 java 中的构造函数)

Render() {
}

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

最佳答案

首先查看 Painting in AWT and SwingPerforming 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 SwingHow to use Swing Timers了解更多详情

对于example

关于Java程序流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29442301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com