Je me suis mis en objectif de creer un logiciel pour faire des dessins, modifier des images ect...
J'ai bien avancé mais je suis à l'arret sur un probleme : Recuperer dans une autre class une variable de type Color (JColorChooser). Les Public static rende ma variable impossibl a mettre dans un g.setColor (dans les Graphics).
Et ducou j'aimerais que le boutons pour que la page de couleurs qui s'afficher soit dans la class outil (bar d'outil).
Mes codes :
public void actionPerformed (ActionEvent ev) { Object source = ev.getSource(); if(source == nv && fenetre == 1) { nom = JOptionPane.showInputDialog(null, "Entrez le nom de votre Image", "Création D'image", JOptionPane.QUESTION_MESSAGE); x2 =JOptionPane.showInputDialog(null, "Entrez la Taille x de Votre image en pixel", "Taille x", JOptionPane.QUESTION_MESSAGE); y2 =JOptionPane.showInputDialog(null, "Entrez la Taille y de Votre image en pixel", "Taille y", JOptionPane.QUESTION_MESSAGE); Fenetre fen2 = new Fenetre(); fen2.setVisible(true); outil fen3 = new outil(); fen3.setVisible(true); fenetre = 0;
}else{if(source == outil) { outil fen3 = new outil(); fen3.setVisible(true);
}else{ if(source == fe) { int quitt =JOptionPane.showConfirmDialog(null, "Etes-Vous sur de Vouloir quitter ?", "Quitter Editeur d'image", JOptionPane.YES_NO_OPTION);
public class Fenetre extends JFrame{ public static int dessin = 0;
public Fenetre(){ int x; x = Integer.parseInt(FenetreTest.x2); int y; y = Integer.parseInt(FenetreTest.y2); this.setTitle(FenetreTest.nom); this.setSize(x, y);
this.setLocationRelativeTo(null); JPanel pan = new JPanel(); getContentPane().add(pan); pan.setBackground(Color.white); this.setVisible(true); this.setResizable(false); pan.addMouseListener(new dessin (pan)); pan.addMouseMotionListener(new dessin (pan)); } private JPanel pan;
public static void main(String[] args) { // TODO Auto-generated method stub Fenetre fen2 = new Fenetre(); fen2.setVisible(true); } }
De base, à l'exception de certains cas, en java si tu utilises du static pour ce que tu cherches à faire, c'est qu'il y a un sérieux problème de conception (ce qui semble être le cas avec le code que tu as donné).
Autres points:
Tu récupéreras toujours la couleur du jcolorchosser qu’après son affichage, il faut que tu procèdes différemment.
Exemple définition d'une couleur en config que tu associes avec le jcolorchooser et que tu utilises indépendamment dans l'objet de dessin et naturellement le tout sans jamais utiliser de static.
Ok merci de votre réponse mais ducou je n'avais pas très bien saisie ? Comme puis-je procéder différemment vue que je voudrais que la panel de couleur s'affiche lors de l'appuis du bouton dans ma class outil. Ou alors y a t-il un autre moyen de rendre la variable global pour pouvoir la réutiliser ? Car je n'avais pas d'autres idées
Je vais essayer de faire au plus simple (donc oublie le MVC and co)
L'exemple ci dessous permet de modifier la couleur de fond de la zone de dessin de la fenetre A depuis une fenetre B.
Fichier Test.java
Ce fichier contient le main et met en relation la fenetre A et B par le biais d'une interface qui est implémentée dans la zone de dessin
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
DrawWindow dw = new DrawWindow();
ToolWindow tw = new ToolWindow(dw);
dw.setVisible(true);
tw.setVisible(true);
});
}
}
Fichier DrawWindow.java
Ce fichier contient la zone de dessin et implémente l'interface permettant la mise à jour de la couleur de fond de la zone de dessin.
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class DrawWindow extends JFrame implements DrawInterface {
private Surface surface = new Surface();
private Color surfaceBackgroundColor = Color.BLACK;
public DrawWindow() {
setSize(300, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setContentPane(surface);
}
public Color getBackgroundColor() {
return surfaceBackgroundColor;
}
public void setBackgroundColor(Color color) {
/* Mise à jour de la couleur de fond. */
surfaceBackgroundColor = color;
/* Mise à jour de la surface de dessin */
surface.repaint();
}
/*
* Surface de dessin.
*/
class Surface extends JPanel {
/*
* Methode utilisée pour dessiner.
*/
public void paintComponent(Graphics g) {
g.setColor(surfaceBackgroundColor);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
}
Fichier ToolWindow.java
Ce fichier contient le bouton qui ouvrira un JColorChooser pour modifier la couleur de fond de la fenetre de dessin
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ToolWindow extends JFrame implements ActionListener {
private DrawInterface di = null;
private JButton backgroundColor = null;
public ToolWindow(DrawInterface di) {
this.di = di;
setSize(100, 200);
setLocation(10, 10);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
/* Ajout d'un bouton pour changer la couleur */
backgroundColor = new JButton();
backgroundColor.setText("Background color");
backgroundColor.addActionListener(this);
/* Ajout du composant au panel et du panel à la fenetre */
JPanel content = new JPanel();
content.add(backgroundColor);
setContentPane(content);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(backgroundColor)) {
/* Récupération de la nouvelle coleur */
Color color = JColorChooser.showDialog(this, "Select background color", di.getBackgroundColor());
/* Notification de la nouvelle couleur */
di.setBackgroundColor(color);
}
}
}
Edit:
Fichier DrawInterface.java
Interface commune aux classes DrawWindow et ToolWindow
import java.awt.Color;
public interface DrawInterface {
Color getBackgroundColor();
void setBackgroundColor(final Color color);
}
Dev addict
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
Merci pour ta réponse (même si un code tout fait n'était pas mon nécessaire ^^) Je viens donc de essayer ton code dans un nouveau projet pour voir comment cela marche ect... Mais je tombe sur un problème : "DrawInterface cannot be resolved to a type" :c C'est assez problématique vue qu'il affecte toutes les autres class.
Ok merci mais ton code serre bien à changer la couleur de fond. Mais pour donc changer la couleur de mon g.drawoval ça va être différent ^.^ sinon j'ai aussi appris que lorsque je fait apparaître plein de fond (pour dessiner) le g.setcolor ne serre a rien vue que cela restera noir
... J'ai recherché un peux et rien que j'arrive à comprendre. Je pourrais copier le code bêtement mais bon... Merci
Le setColor sera toujours un setColor et ça que tu dessines un rectangle un ovale ou autre. Ici il faut *uniquement* t’arrêter sur l'utilisation de l'interface, qui, si tu en reprends le concept, te permettra de mettre en relation ta zone de dessin et ta boite à outils.
Ne le prend pas mal mais à la lecture de ce que tu dis, tu devrais faire une pause dans ton projet et revoir une partie des concepts de java2d afin de te permettre de mieux comprendre les graphiques en java.
Pour tes prochaines questions, je t’encourage à ne pas simplement dire "je ne comprends pas", mais plus de nous indiquer ce que tu ne comprends pas...
J'ai bien compris ton exemple pour mettre en relation ma class outil et fenêtre jusque là pas de problème. Je disais juste que lorsque je trace un trait (Avec un MouseDragged) et un MouseMotionListener le couleurs reste noir alors que lorsque j'en créer un seul avec le MousePressed, l'oval prend bien la couleur. Bref je vais aller faire un tour sur java2d et encore merci ! :)
Ici, il s'agit plus d'un problème de compréhension de Swing (repaint and co), java2D et également de conception.
Exemple avec ce code qui reprend les notions du précédent.
Ce code ouvre une boite à outils qui permet de dessiner des formes et de sélectionner la couleur pour les formes que tu souhaites dessiner.
Ici il ne s'agit pas de la meilleure façon de faire, mais je pense qu'elle est assez simple à comprendre.
Naturellement, si il y a des points d'ombres, dit le.
Fichier Test.java:
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
DrawWindow dw = new DrawWindow();
ToolWindow tw = new ToolWindow(dw);
dw.setVisible(true);
tw.setVisible(true);
});
}
}
Fichier ToolWindow.java:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ToolWindow extends JFrame implements ActionListener {
/* variable utilisée pour placer aléatoirement les formes */
private Random rnd = new Random(100);
private static final Color DEFAULT_COLOR = Color.BLACK;
private DrawInterface di = null;
private JButton btSelectedColor = null;
private JButton btFillRectangle = null;
private JButton btFillOval = null;
private JButton btDrawRectangle = null;
private JButton btDrawOval = null;
private Color selectedColor = DEFAULT_COLOR;
public ToolWindow(DrawInterface di) {
this.di = di;
setSize(100, 200);
setLocation(10, 10);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
/* Ajout d'un bouton pour changer la couleur */
btSelectedColor = new JButton();
btSelectedColor.setText("Color");
btSelectedColor.addActionListener(this);
/* Ajout d'un bouton pour changer dessiner un cercle */
btFillOval = getButton("Fill oval");
/* Ajout d'un bouton pour changer dessiner un rectangle */
btFillRectangle = getButton("Fill rectangle");
/* Ajout d'un bouton pour changer dessiner un cercle */
btDrawOval = getButton("Draw oval");
/* Ajout d'un bouton pour changer dessiner un rectangle */
btDrawRectangle = getButton("Draw rectangle");
/* Ajout des boutons au panel et du panel à la fenêtre */
JPanel content = new JPanel();
content.add(btSelectedColor);
content.add(btFillOval);
content.add(btFillRectangle);
content.add(btDrawOval);
content.add(btDrawRectangle);
setContentPane(content);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(btSelectedColor)) {
/* Récupération de la nouvelle couleur */
selectedColor = JColorChooser.showDialog(this, "Select background color", selectedColor);
} else if(e.getSource().equals(btFillOval)) {
/* Dessine la forme avec la couleur précédemment sélectionnée*/
/* Ici le positionnement est géré aléatoirement */
di.fillOval(nextBornedDouble(), nextBornedDouble(), nextBornedDouble(), nextBornedDouble(), selectedColor);
} else if(e.getSource().equals(btFillRectangle)) {
/* Dessine la forme avec la couleur précédemment sélectionnée*/
/* Ici le positionnement est géré aléatoirement */
di.fillRectangle(nextBornedDouble(), nextBornedDouble(), nextBornedDouble(), nextBornedDouble(), selectedColor);
} else if(e.getSource().equals(btDrawOval)) {
/* Dessine la forme avec la couleur précédemment sélectionnée*/
/* Ici le positionnement est géré aléatoirement */
di.drawOval(nextBornedDouble(), nextBornedDouble(), nextBornedDouble(), nextBornedDouble(), selectedColor);
} else if(e.getSource().equals(btDrawRectangle)) {
/* Dessine la forme avec la couleur précédemment sélectionnée*/
/* Ici le positionnement est géré aléatoirement */
di.drawRectangle(nextBornedDouble(), nextBornedDouble(), nextBornedDouble(), nextBornedDouble(), selectedColor);
}
}
/* Code utilitaire sans réelle importance */
private JButton getButton( final String text) {
JButton bt = new JButton();
bt.setText(text);
bt.addActionListener(this);
return bt;
}
private double nextBornedDouble() {
int min = 10, max = 200;
return min + (max - min) * rnd.nextDouble();
}
}
Fichier DrawInterface.java:
import java.awt.Color;
public interface DrawInterface {
void fillRectangle(double x, double y, double w, double h, Color c);
void fillOval(double x, double y, double w, double h, Color c);
void drawRectangle(double x, double y, double w, double h, Color c);
void drawOval(double x, double y, double w, double h, Color c);
}
Fichier DrawWindow.java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class DrawWindow extends JFrame implements DrawInterface {
private Surface surface = new Surface();
private List<SurfaceShape> shapes = new ArrayList<>();
public DrawWindow() {
setSize(300, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setContentPane(surface);
}
public void drawRectangle(double x, double y, double w, double h, Color c) {
/* Ajout de la nouvelle forme */
shapes.add(new SurfaceShape(c, new Rectangle2D.Double(x, y, w, h), false));
/* Redessine la vue*/
surface.repaint();
}
public void drawOval(double x, double y, double w, double h, Color c) {
/* Ajout de la nouvelle forme */
shapes.add(new SurfaceShape(c, new Ellipse2D.Double(x, y, w, h), false));
/* Redessine la vue*/
surface.repaint();
}
public void fillRectangle(double x, double y, double w, double h, Color c) {
/* Ajout de la nouvelle forme */
shapes.add(new SurfaceShape(c, new Rectangle2D.Double(x, y, w, h), true));
/* Redessine la vue*/
surface.repaint();
}
public void fillOval(double x, double y, double w, double h, Color c) {
/* Ajout de la nouvelle forme */
shapes.add(new SurfaceShape(c, new Ellipse2D.Double(x, y, w, h), true));
/* Redessine la vue*/
surface.repaint();
}
/*
* Surface de dessin.
*/
class Surface extends JPanel {
/*
* Methode utilisée pour dessiner.
*/
public void paintComponent(Graphics g) {
g.clearRect(0, 0, getWidth(), getHeight());
/* passage en 2D */
Graphics2D g2 = (Graphics2D)g;
/* Activation de l'antialiasing (plus beau avec les forme arrondies */
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
/* Dépile les shape pour les dessiner */
for(SurfaceShape ss : shapes) {
/* Modification de la couleur qui sera utilisée pour dessiner la forme */
g2.setColor(ss.color);
/* Dessine uniquement les contours ou remplie également la forme. */
if(!ss.fill)
g2.draw(ss.shape);
else
g2.fill(ss.shape);
}
}
}
/*
* Élément de la surface.
*/
class SurfaceShape {
Color color;
Shape shape;
boolean fill;
public SurfaceShape(Color color, Shape shape, boolean fill) {
this.color = color;
this.shape = shape;
this.fill = fill;
}
}
}
Comme tu peux le constater dans la classe DrawWindow j'utilise une liste qui va permettre de stocker les différentes formes ainsi que la couleur associée.
Comme ça au moment du repaint de la fenêtre on peut re associer forme + couleur.
Merci beaucoup de ta réponse je test cela des lors que je peux utiliser mon pc ^.^ je verrais si cela marche même si il a sans mentir plein de choses que je ne comprends pas très bien dans ton code :) mais bon c'est en fortement que l'on devient forgeron ^^
Ton code marche bien mais cela ne m'avance pas trop ^.^ Ce n'est pas vraiment ce que je recherche ducou :P Je Recherche juste a que lor d'un MouseDragged, mon g.filloval soit de la couleur de couleur. Comme je disais, j'ai donc réussi a récupérer ma variable color(grâce a toi :)) mais bon le g.setColor fonctionne que pour le MousePressed/MousePressed. Il ne fonctionne pas lorsque je glisse ma souris et que pleins de oval apparaissent (pour faire le traits). Merci quand même pour tout :D
Inspire toi de ce que je t'ai montré dans le code ci-dessus et utilise une liste pour stocker les couleurs et les formes associées.
Si tu fais une g.setColor(...) TOUTES les formes qui seront dessinées auront la couleur passée à setColor et ce jusqu'au prochain appel de setColor qui changera la couleur pour les formes qui suivront.
Oui ok je comprend pour le g.setcolor. Il va changer la couleurs de toutes mes formes. Mais de base, le g.setcolor ne change rien ! quand je dessine, les formes restent noir --'
Si tu es toujours sur le code identique à celui que tu as posté, dans le if source == couleur de la méthode actionPerformed de l'objet outil.java tu n'utilises pas la le retour du JColorChooser et pour le reste inspire toi de mon exemple.
Dans le cas contraire repose tes updates de codes (stp ne le fait pas en cliquant sur le lien "Répondre" mais sur le bouton bleu "Répondre au sujet" qui est en bas de page).
Ici les classes FenetreTest.java et Fenetre.java ne sont pas nécessaires