ejemplo java swing graphics paintcomponent

ejemplo - Java Graphics Checkout Simulation;



paintcomponent java ejemplo (2)

Estoy trabajando en un proyecto que es una simulación de Checkout. Tengo el código para que funcione, pero me cuesta entender e implementar cómo agregar gráficos (en mi caso un cuadrado) una vez que cierta condición es verdadera. Por ejemplo, he hecho mi código para que pase por números aleatorios y si 2,4,6 u 8 se han generado aleatoriamente, alguien se agregará a la cola y lo mismo ocurre si son números pares 1 o 3, alguien se elimina de la cola. Básicamente, solo quiero saber cómo agregar un cuadrado a la pantalla una vez que he cumplido con mi condición (por ejemplo, generar un 4 debería agregar un cuadrado a la pantalla pero no lo hace) ¡CUALQUIER ayuda realmente sería apreciada!

clase pública MainPanel extiende 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); } }


¿Cómo se supone que funcione? cuando cumples la condición, se agrega un elemento a tillQueue, pero tillQueue nunca se lee ...

Si desea dibujar algo, puede dibujarlo en el método paintComponent.

Para dibujar un rectángulo simplemente use:

http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#drawRect(int , int, int, int)

Puede iterar la sentencia tillQueue en el método paintComponent y dibujar los rectángulos correspondientes.


Tenga en cuenta varios cambios para que funcione la representación:

  • Para mayor comodidad, use el método createGraphics() del buffer y dispose() cuando createGraphics() .

  • Inicialice el buffer fuera de pantalla a un estado conocido.

  • Una instancia de Random suele ser suficiente.

  • Limite el alcance de la variable en la medida de lo posible, p. private class TimerEvent ., private class TimerEvent .

  • getPreferredSize() para establecer el tamaño del área de representación.

Como probado:

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://.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); } } }