Java程序流
我已经用python编程一段时间了,现在对学习Java感兴趣一段时间了,所以我想我会尝试一下,所以发发发慈悲吧,我知道目前这是一个无限循环,所以请小心行事Java程序流,java,swing,awt,Java,Swing,Awt,我已经用python编程一段时间了,现在对学习Java感兴趣一段时间了,所以我想我会尝试一下,所以发发发慈悲吧,我知道目前这是一个无限循环,所以请小心行事 import javax.swing.*; import java.awt.*; public class snake extends JFrame{ public static void main(String[] args) { JFrame screen = new JFrame("Snake");
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中的构造函数)
一段代码。它在每个迭代中循环,我希望它以什么样的方式用于方法。我尝试从构造函数内部调用该方法,但没有成功。我如何安排程序的流程,使循环的每次迭代都能通过该方法?谢谢你抽出时间 首先看一看,了解更多关于Swing中绘画的细节
这个
while(true) {
pane.add(new Render());
}
会引起问题的。如果它不阻止事件调度线程,它将运行得非常快,因为它会导致其他线程暂停(或运行得更慢),并且只需将Render
的新实例不断添加到窗格
,我很确定您不希望这样
通常建议覆盖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);
}
}
}
您可能需要执行一些动画,查看和了解更多详细信息
对于,您对awt中的渲染有何建议?在添加Render()的新实例之前,是否有一种方法可以清除窗格?如何在循环的每次迭代中路由代码以重新渲染矩形?感谢wuick的回复。不,不要在每个周期添加一个新的
Render
窗格,只需创建一个实例并添加它即可。您可以在Render
中更改变量以生成动画。谢谢您的回答,我假设Render实例在添加后不会更改,您需要更新它。您可以通过更改paintComponent
方法使用的变量来影响Render
面板上的更改,然后重新粉刷面板。与尝试添加新的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);
}
}
}