我已经在python中编程了一段时间,并且有兴趣学习Java一段时间了所以我想我会给它一个去,所以有怜悯我知道这是一个无限循环此刻所以谨慎行事。< / p>
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() {
}
一段代码。它在每次迭代中循环,我希望它如何用于该方法。我试图从构造函数内部调用该方法,但是没有用。我如何路由程序的流程,以便我的循环的每次迭代程序都通过该方法?谢谢你的时间。
答案 0 :(得分:2)
首先看一下Painting in AWT and Swing和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和How to use Swing Timers了解更多详情