Changer la couleur de la forme de dessin spécifique lorsque je clique dessus AWT

Fermé
mawan1 Messages postés 2 Date d'inscription dimanche 28 novembre 2021 Statut Membre Dernière intervention 11 janvier 2022 - Modifié le 28 nov. 2021 à 13:32
mawan1 Messages postés 2 Date d'inscription dimanche 28 novembre 2021 Statut Membre Dernière intervention 11 janvier 2022 - 28 nov. 2021 à 16:48
Bonjour, J'ai ce code, et je veux y ajouter la fonctionnalité pour changer la couleur de la seule forme sur laquelle je clique, les autres formes restent à l'écran avec la même couleur, toute suggestion sera appréciée.

Merci d'avance.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
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> avaliableColors = new ArrayList<>(16);
        private Shape face;

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

            Area area = new Area();
            area.add(new Area(new Ellipse2D.Double(108, 110, 200, 200)));
            area.add(new Area(new Ellipse2D.Double(160, 150, 20, 20)));
            area.add(new Area(new Ellipse2D.Double(240, 150, 20, 20)));
            area.add(new Area(new Rectangle2D.Double(160, 220, 100, 40)));
            face = area;

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

            JButton btn = new JButton("Change color");
            btn.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    changeColor();
                }
            });
            add(btn, BorderLayout.SOUTH);

            addMouseListener(new MouseAdapter(){
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (face.contains(e.getPoint())) {
                        changeColor();
                    }
                }
            });
        }

        protected void changeColor(){
            // Randomise the colors
            Collections.shuffle(avaliableColors);
            color = avaliableColors.get(0);
            repaint();
        }

        @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();
        }

    }
}

2 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
28 nov. 2021 à 15:50
Bonjour,

Tu peux y arriver assez facilement à condition d'avoir un Container qui contient plusieurs Component, chacun étant responsable du dessin d'une seule forme, avec sa couleur propre.

Exemple :

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class DessinFrame {
    public static void main(String... args) {
        Frame frame = new Frame();
        frame.setSize(600, 400);
        frame.setLocationRelativeTo(null);
        frame.add(new DessinContainer(
                new Ellipse2D.Double(108, 110, 200, 200),
                new Ellipse2D.Double(160, 150, 20, 20),
                new Ellipse2D.Double(240, 150, 20, 20),
                new Rectangle2D.Double(160, 220, 100, 40)));
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e) {
                frame.dispose();
            }
        });
    }
}

class DessinContainer extends Container {
    private static final long serialVersionUID = 1L;

    private static final Color[] availableColors = {
            Color.BLACK,
            Color.BLUE,
            Color.CYAN,
            Color.DARK_GRAY,
            Color.GRAY,
            Color.GREEN,
            Color.LIGHT_GRAY,
            Color.MAGENTA,
            Color.ORANGE,
            Color.PINK,
            Color.RED,
            Color.WHITE,
            Color.YELLOW
    };

    private final DessinComponent[] components;

    public DessinContainer(Shape... shapes) {
        setLayout(null);
        setLocation(0, 0);
        setSize(Short.MAX_VALUE, Short.MAX_VALUE);

        components = new DessinComponent[shapes.length];
        for (int i = 0; i < shapes.length; i++) {
            components[i] = new DessinComponent(shapes[i], availableColors[0]);
            add(components[i]);
        }

        addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e) {
                for (DessinComponent component : components) {
                    if (component.contains(e.getPoint())) {
                        Color randomColor = availableColors[(int) (Math.random() * availableColors.length)];
                        component.setColor(randomColor);
                    }
                }
            }
        });
    }
}

class DessinComponent extends Component {
    private static final long serialVersionUID = 1L;

    private Shape shape;
    private Color color;

    public DessinComponent(Shape shape, Color color) {
        this.shape = shape;
        this.color = color;
        setLocation(0, 0);
        setSize(Short.MAX_VALUE, Short.MAX_VALUE);
    }

    public void setColor(Color color) {
        this.color = color;
        repaint();
    }

    @Override
    public boolean contains(Point point) {
        return shape.contains(point);
    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(color);
        g2.draw(shape);
    }
}
0
mawan1 Messages postés 2 Date d'inscription dimanche 28 novembre 2021 Statut Membre Dernière intervention 11 janvier 2022
28 nov. 2021 à 16:48
Merci pour votre aide ! SVP une dernière demande, je voulais aussi realiser un code permettant de construire des lignes, des cercles et des rectangles.
j'ai ajouter droplist avec "Rectangle", "Ligne" et "Cercle" et je veux que lorsque je clique sur un de ces boutons et qu'ensuite sur un autre bouton DrawComponent, la figure de l'un de ces types est affichée à l'endroit où vous venez de cliquer.
le code que j'ai fait :
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Dialogue {

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

public Dialogue(){
EventQueue.invokeLater(new Runnable(){
@Override
public void run(){
JFrame frame = new JFrame();
frame.add(new Panel(Color.RED));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

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

}
});
}

public class Panel extends JPanel implements ActionListener,MouseListener {

private String shapeName;
private int x=10,y=20;
private int shape;
private Color color;

public Panel(Color color) {
//super(new BorderLayout());
this.color = color;
String[] petStrings = { "Cercle", "Rectangle", "Ligne" };

//Create the combo box, select the item at index 4.
//Indices start at 0, so 4 specifies the pig.
JComboBox petList = new JComboBox(petStrings);
petList.setSelectedIndex(2);
petList.addActionListener(this);
//Lay out the demo.

add(petList);
this.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
int currentX = e.getX();
int currentY = e.getY();
System.out.print("am mouse clicked");
if(shapeName.equals("Ligne")) {
shape = 1;
}
else if(shapeName.equals("Rectangle")) {
shape = 2;
}
else if(shapeName.equals("Cercle")) {
shape = 3;
}
repaint();

}
});

}
public void paint(Graphics gui) {
super.paint(gui);
Graphics2D g2d = (Graphics2D) gui.create();
g2d.setColor(color);
System.out.print("am Paint method");
if(shape == 1)
g2d.drawLine(x, y, x+20,y+30);
if(shape == 2)
g2d.drawRect(x,y,30,50);
if(shape == 3)
g2d.drawOval(x,y,30,30);
g2d.dispose();
}


/** Listens to the combo box. */
public void actionPerformed(ActionEvent e) {
System.out.print("am action listener");
JComboBox cb = (JComboBox)e.getSource();
shapeName = (String)cb.getSelectedItem();

}



@Override
public void mousePressed(MouseEvent e) {

}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub

}
}
}

Si vous pouvez svp le modifier pour affichée la figure à l'endroit où vous venez de cliquer.
0