Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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_Graphics_Paintcomponent - Fatal编程技术网

Java图形检验仿真;

Java图形检验仿真;,java,swing,graphics,paintcomponent,Java,Swing,Graphics,Paintcomponent,我正在做一个项目,这是一个检验模拟。我有代码让它运行,但我正在努力理解和实现如何添加图形(在我的例子中是一个正方形),一旦某个条件是真的。例如,我制作了我的代码,使其通过随机数,如果随机生成了2、4、6或8,则将有人添加到队列中,如果他们是偶数1或3,则将有人从队列中删除。基本上,我只是想知道在满足条件后如何在屏幕上添加一个正方形(例如,生成一个4应该在屏幕上添加一个正方形,但它没有) 任何帮助都将不胜感激 公共类主面板扩展了JPanel{ private Queue<String

我正在做一个项目,这是一个检验模拟。我有代码让它运行,但我正在努力理解和实现如何添加图形(在我的例子中是一个正方形),一旦某个条件是真的。例如,我制作了我的代码,使其通过随机数,如果随机生成了2、4、6或8,则将有人添加到队列中,如果他们是偶数1或3,则将有人从队列中删除。基本上,我只是想知道在满足条件后如何在屏幕上添加一个正方形(例如,生成一个4应该在屏幕上添加一个正方形,但它没有) 任何帮助都将不胜感激

公共类主面板扩展了JPanel{

    private Queue<String> tillQueue;
    private int rndNumber;
    private int currentLength;
    private ArrayList<Integer> lengthList;
    private double mean;
    private Random rand;
    private int MAXLENGTH;

    private static Random r = new Random();
    private static Random r2 = new Random();
    Color colour;
    private static final int IMAGE_SIZE = 600;

    private Timer timer;
    private int delay;

    private JButton startButton;
    private JButton stopButton;
    private BufferedImage buffer;
    JToolBar toolbar;

    public MainPanel() {
        startButton = new JButton("START");
        stopButton = new JButton("STOP");
        toolbar = new JToolBar();
        toolbar.add(startButton);
        toolbar.add(stopButton);

        this.buffer = new BufferedImage(IMAGE_SIZE, IMAGE_SIZE, BufferedImage.TYPE_INT_ARGB);
        setDoubleBuffered(false);

        StartActionHandler start = new StartActionHandler();
        StopActionHandler stop = new StopActionHandler();
        TimerEvent timerEvt = new TimerEvent();

        startButton.addActionListener(start);
        stopButton.addActionListener(stop);
        delay = 50;
        timer = new Timer(delay, timerEvt);
    }

    public class TimerEvent implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            //drawNext(buffer.getGraphics());

            for (int time = 1; time < 9; time++) {
                rndNumber = rand.nextInt(6) + 1; //generates random number

                if (rndNumber == 2 || rndNumber == 4 || rndNumber == 6 || rndNumber == 8) {
                    //time is added to queue                        
                    tillQueue.add(String.valueOf(time));
                    drawNext(buffer.getGraphics());
                    repaint();
                }
            }
        }
    }

    public class StartActionHandler implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            timer.start();
        }
    }

    private void drawNext(Graphics g) {
        int x = r.nextInt(IMAGE_SIZE);
        int y = r.nextInt(IMAGE_SIZE);
        int red = r2.nextInt(255);
        int green = r2.nextInt(255);
        int blue = r2.nextInt(255);
        Color randomColour = new Color(red, green, blue);
        g.setColor(randomColour);
        g.fillRect(x, y, 10, 10);
        repaint();
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(buffer, 0, 0, this);
    }
}
专用队列;
私人国际号码;
私有int当前长度;
私人田径运动员;
私人双平均;
私有随机兰德;
私有整数最大长度;
私有静态随机r=新随机();
私有静态随机r2=新随机();
颜色;
私有静态最终整型图像大小=600;
私人定时器;
私有整数延迟;
私有JButton开始按钮;
私人按钮停止按钮;
专用缓冲区图像缓冲区;
JToolBar工具栏;
公共主面板(){
startButton=新的JButton(“开始”);
stopButton=新按钮(“停止”);
工具栏=新的JToolBar();
工具栏。添加(开始按钮);
工具栏。添加(停止按钮);
this.buffer=新的BuffereImage(图像大小、图像大小、BuffereImage.TYPE\u INT\u ARGB);
setDoubleBuffered(假);
StartActionHandler start=新的StartActionHandler();
StopActionHandler stop=新的StopActionHandler();
TimerEvent timerEvt=新的TimerEvent();
addActionListener(开始);
stopButton.addActionListener(停止);
延迟=50;
定时器=新定时器(延迟、定时器转速);
}
公共类TimerEvent实现ActionListener{
已执行的公共无效操作(操作事件e){
//drawNext(buffer.getGraphics());
for(int time=1;time<9;time++){
rndNumber=rand.nextInt(6)+1;//生成随机数
如果(rndNumber==2 | | rndNumber==4 | | rndNumber==6 | | rndNumber==8){
//时间被添加到队列中
添加(String.valueOf(time));
drawNext(buffer.getGraphics());
重新油漆();
}
}
}
}
公共类StartActionHandler实现ActionListener{
已执行的公共无效操作(操作事件e){
timer.start();
}
}
下一页(图g){
int x=r.nextInt(图像大小);
int y=r.nextInt(图像大小);
int red=r2.nextInt(255);
绿色整数=r2.nextInt(255);
蓝色整数=r2.nextInt(255);
颜色=新颜色(红色、绿色、蓝色);
g、 设置颜色(随机颜色);
g、 fillRect(x,y,10,10);
重新油漆();
}
受保护组件(图形g){
超级组件(g);
g、 drawImage(缓冲区,0,0,this);
}
}

如何支持工作?当您满足条件时,一个项目被添加到tillQueue,但tillQueue从未被读取

如果你想画一些东西,你可以在方法paintComponent中画出来

要绘制矩形,只需使用:

,int,int,int)


您可以在paintComponent方法中迭代tillQueue并绘制相应的矩形。

支持如何工作?当您满足条件时,一个项目被添加到tillQueue,但tillQueue从未被读取

如果你想画一些东西,你可以在方法paintComponent中画出来

要绘制矩形,只需使用:

,int,int,int)


您可以在paintComponent方法中迭代tillQueue并绘制相应的矩形。

支持如何工作?当您满足条件时,一个项目被添加到tillQueue,但tillQueue从未被读取

如果你想画一些东西,你可以在方法paintComponent中画出来

要绘制矩形,只需使用:

,int,int,int)


您可以在paintComponent方法中迭代tillQueue并绘制相应的矩形。

支持如何工作?当您满足条件时,一个项目被添加到tillQueue,但tillQueue从未被读取

如果你想画一些东西,你可以在方法paintComponent中画出来

要绘制矩形,只需使用:

,int,int,int)


您可以在paintComponent方法中迭代tillQueue并绘制相应的矩形。

请注意几个更改以使渲染工作正常:

  • 为方便起见,请使用缓冲区的
    createGraphics()
    方法,并在完成后使用
    dispose()
    方法

  • 将屏幕外的
    缓冲区初始化为已知状态

  • 一个
    Random
    实例通常就足够了

  • 尽可能限制变量范围,例如
    私有类TimerEvent

  • 替代以建立渲染区域大小

经测试:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.Timer;

/**
 * @see https://stackoverflow.com/a/21238669/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new MainPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().display();
            }
        });
    }

    private static class MainPanel extends JPanel {

        private static final int SIZE = 500;
        private static final int DELAY = 100;
        private static final Random r = new Random();
        private final Queue<String> tillQueue = new LinkedList<>();
        private Timer timer;
        private JButton startButton;
        private JButton stopButton;
        private BufferedImage buffer;
        private JToolBar toolbar;

        public MainPanel() {
            super(new BorderLayout());
            startButton = new JButton("START");
            stopButton = new JButton("STOP");
            toolbar = new JToolBar();
            toolbar.add(startButton);
            toolbar.add(stopButton);
            buffer = new BufferedImage(SIZE, SIZE, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = buffer.createGraphics();
            g.clearRect(0, 0, SIZE, SIZE);
            g.dispose();
            StartActionHandler start = new StartActionHandler();
            TimerEvent timerEvt = new TimerEvent();
            timer = new Timer(DELAY, timerEvt);
            startButton.addActionListener(start);
            add(new JLabel(new ImageIcon(buffer)));
            add(toolbar, BorderLayout.SOUTH);
        }

        private class TimerEvent implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                for (int time = 1; time < 9; time++) {
                    if (r.nextInt(6) % 2 == 0) {
                        tillQueue.add(String.valueOf(time));
                        drawNext();
                    }
                }
            }
        }

        private class StartActionHandler implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                timer.start();
            }
        }

        private void drawNext() {
            Graphics2D g = buffer.createGraphics();
            int x = r.nextInt(SIZE);
            int y = r.nextInt(SIZE);
            g.setColor(new Color(r.nextInt()));
            g.fillRect(x, y, 10, 10);
            g.dispose();
            repaint();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(buffer, 0, 0, this);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(SIZE, SIZE);
        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.util.LinkedList;
导入java.util.Queue;
导入java.util.Random;
导入javax.swing.ImageIcon;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JToolBar;
导入javax.swing.Timer;
/**
*@见https://stackoverflow.com/a/21238669/230513
*/
公开课考试{
专用void display(){
JFrame f=新JFrame(“测试”);
f、 塞特德法