Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java程序流_Java_Swing_Awt - Fatal编程技术网

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");

我已经用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中的构造函数)

一段代码。它在每个迭代中循环,我希望它以什么样的方式用于方法。我尝试从构造函数内部调用该方法,但没有成功。我如何安排程序的流程,使循环的每次迭代都能通过该方法?谢谢你抽出时间

首先看一看,了解更多关于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);
        }
    }
}