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