es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cambie el color del dibujo haciendo clic en él AWT JAVA

Quiero agregar a este código la funcionalidad de cambiar el color del dibujo haciendo clic en él, pero no sé si este código lo soportará.

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;

public class TestGraphic {

    public static void main(String[] args) {
        new TestGraphic();
    }

    public TestGraphic() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Frame frame = new Frame();
                frame.add(new Composants());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                frame.addWindowListener((WindowListener) new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent windowEvent){
                       System.exit(0);
                    }        
                 });

            }
        });   
    }

    public class Composants extends Container {

        private Color color = Color.BLACK;
        private List<color> availableColors = new ArrayList<>(16);

        public Composants() {
            setLayout(new BorderLayout());

            availableColors.add(Color.BLACK);
            availableColors.add(Color.BLUE);
            availableColors.add(Color.CYAN);
            availableColors.add(Color.DARK_GRAY);
            availableColors.add(Color.GRAY);
            availableColors.add(Color.GREEN);
            availableColors.add(Color.LIGHT_GRAY);
            availableColors.add(Color.MAGENTA);
            availableColors.add(Color.ORANGE);
            availableColors.add(Color.PINK);
            availableColors.add(Color.RED);
            availableColors.add(Color.WHITE);
            availableColors.add(Color.YELLOW);

            JButton btn = new JButton("Cambiar Color");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Collections.shuffle(availableColors);
                    color = availableColors.get(0);
                    repaint();
                }
            });
            add(btn, BorderLayout.SOUTH);

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(600, 400);
        }
        public void close() {
            addComponentListener((ComponentListener) new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent windowEvent){
                   System.exit(0);
                }        
             });
        }

        @Override
        public void paint(Graphics gui) {
            super.paint(gui);
            Graphics2D g2d = (Graphics2D) gui.create();
            g2d.setColor(color);
            g2d.drawOval(108, 110, 200, 200);
            g2d.drawOval(160, 150, 20, 20);
            g2d.drawOval(240, 150, 20, 20);
            g2d.drawRect(160, 220, 100, 40);
            g2d.dispose();
        }

    }
}

Lo que encontré en internet es crear las clases Rectangle y Circle, pero si pudiera hacerlo aquí sería genial, gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar la funcionalidad de cambiar el color del dibujo haciendo clic en él, se puede agregar un mouse listener a la clase Composants. Dentro del mouse listener, se pueden obtener las coordenadas del clic del mouse y verificar si se encuentra dentro de los límites del círculo o el rectángulo. Si es así, se puede cambiar el color correspondientemente y volver a pintar la gráfica.

    Aquí hay una implementación de ejemplo:

    public class Composants extends Container {
    
        private Color color = Color.BLACK;
        private List<color> availableColors = new ArrayList<>(16);
        private Rectangle rectangle = new Rectangle(160, 220, 100, 40);
        private Ellipse2D ellipse = new Ellipse2D.Float(108, 110, 200, 200);
        private Ellipse2D ellipse1 = new Ellipse2D.Float(160, 150, 20, 20);
        private Ellipse2D ellipse2 = new Ellipse2D.Float(240, 150, 20, 20);
    
        public Composants() {
            setLayout(new BorderLayout());
    
            availableColors.add(Color.BLACK);
            availableColors.add(Color.BLUE);
            availableColors.add(Color.CYAN);
            availableColors.add(Color.DARK_GRAY);
            availableColors.add(Color.GRAY);
            availableColors.add(Color.GREEN);
            availableColors.add(Color.LIGHT_GRAY);
            availableColors.add(Color.MAGENTA);
            availableColors.add(Color.ORANGE);
            availableColors.add(Color.PINK);
            availableColors.add(Color.RED);
            availableColors.add(Color.WHITE);
            availableColors.add(Color.YELLOW);
    
            JButton btn = new JButton("Cambiar color");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // Aleatorizar los colores
                    Collections.shuffle(availableColors);
                    color = availableColors.get(0);
                    repaint();
                }
            });
            add(btn, BorderLayout.SOUTH);
    
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    int x = e.getX();
                    int y = e.getY();
    
                    if (ellipse.contains(x, y) || ellipse1.contains(x, y) || ellipse2.contains(x, y)
                            || rectangle.contains(x, y)) {
                        // Aleatorizar los colores
                        Collections.shuffle(availableColors);
                        color = availableColors.get(0);
                        repaint();
                    }
                }
            });
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(600, 400);
        }
    
        @Override
        public void paint(Graphics gui) {
            super.paint(gui);
            Graphics2D g2d = (Graphics2D) gui.create();
            g2d.setColor(color);
            g2d.draw(ellipse);
            g2d.draw(ellipse1);
            g2d.draw(ellipse2);
            g2d.draw(rectangle);
            g2d.dispose();
        }
    
    }
    

    En esta implementación, las clases Rectangle y Circle no se usan, en su lugar, se ha utilizado la clase Ellipse2D para dibujar los círculos. Se ha agregado un mouse listener para verificar si el clic del mouse está dentro de los límites de las formas y cambiar el color correspondientemente. Tenga en cuenta que el método paint ahora dibuja todas las formas utilizando el objeto Graphics2D.

Comments are closed.