Récupérer une variable Color dans une autre class

Siloze 4 Messages postés samedi 22 juillet 2017Date d'inscription 26 juillet 2017 Dernière intervention - 22 juil. 2017 à 20:43 - Dernière réponse : Twinuts 5251 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 30 octobre 2017 Dernière intervention
- 26 juil. 2017 à 17:37
Bonjour,

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 :

- FenetreTest.java (Fenetre de Base)
package Fenetre;


import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class FenetreTest extends JFrame implements ActionListener{


public static int nvf = 0;
public static String nom;
public static String x2, y2;
public static int fenetre = 1;


public FenetreTest() {


bar = new JMenuBar();
setJMenuBar(bar);
fichier = new JMenu("Fichier");
bar.add(fichier);
fichier.addActionListener(this);



edition = new JMenu("Edition");
bar.add(edition);

aide = new JMenu("Aide");
bar.add(aide);


outil = new JMenuItem("Afficher La Bar D'outil");
edition.add(outil);
outil.addActionListener(this);


f = new JMenuItem("______");
edition.add(f);
f.addActionListener(this);

ar = new JMenuItem("Retour Arriere");
edition.add(ar);
ar.addActionListener(this);

av = new JMenuItem("Retour Avant");
edition.add(av);
av.addActionListener(this);

f = new JMenuItem("______");
edition.add(f);
f.addActionListener(this);


coup = new JMenuItem("Couper");
edition.add(coup);
coup.addActionListener(this);

cop = new JMenuItem("Copier");
edition.add(cop);
cop.addActionListener(this);

col = new JMenuItem("Coller");
edition.add(col);
col.addActionListener(this);

f = new JMenuItem("______");
edition.add(f);
f.addActionListener(this);


nv = new JMenuItem("Nouvelle Fenetre");
fichier.add(nv);
nv.addActionListener(this);
nv.addActionListener(this);


ov = new JMenuItem("Ouvrir");
fichier.add(ov);
ov.addActionListener(this);

f = new JMenuItem("______");
fichier.add(f);
f.addActionListener(this);

enr = new JMenuItem("Enregistrer");
fichier.add(enr);
enr.addActionListener(this);

enr2 = new JMenuItem("Enregistrer Sous");
fichier.add(enr2);
enr2.addActionListener(this);


f = new JMenuItem("______");
fichier.add(f);
f.addActionListener(this);

imp = new JMenuItem("Imprimer");
fichier.add(imp);
imp.addActionListener(this);

f = new JMenuItem("______");
fichier.add(f);
f.addActionListener(this);


fe = new JMenuItem("Fermer");
fichier.add(fe);
fe.addActionListener(this);




pr = new JMenuItem("Préférence");
aide.add(pr);
pr.addActionListener(this);



ap = new JMenuItem("A Propos");
aide.add(ap);
ap.addActionListener(this);



vr = new JMenuItem("Version");
aide.add(vr);
vr.addActionListener(this);

Container contenu = getContentPane();
contenu.setLayout(new FlowLayout());
this.setTitle("test");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(720, 400);
this.setBackground(Color.white);
this.setLocationRelativeTo(null);





}


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);

if(quitt == 0) {
this.dispose();

}else {
if(source == fichier) {
}else {
if(source == enr2) {




}
}
}
}
}
}

}


private JMenuBar bar;
private JMenu fichier;
private JMenu aide;
private JMenu edition;
private JMenuItem enr;
private JMenuItem nv;
private JMenuItem ov;
private JMenuItem f;
private JMenuItem enr2;
private JMenuItem imp;
private JMenuItem fe;
private JMenuItem av;
private JMenuItem ar;
private JMenuItem coup;
private JMenuItem cop;
private JMenuItem col;
private JMenuItem outil;
private JMenuItem pr, ap, vr;
public static void main(String[] args) {
// TODO Auto-generated method stub

FenetreTest fen = new FenetreTest();
fen.setVisible(true);



}




}



Mon outil.java (ma bar d'outil justement)


package Fenetre;


import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class outil extends JFrame implements ActionListener{

public static int outil = 0;
static String[] couleurs = {"Blanc", "Noir", "Rouge", "Vert", "Bleu"};
public static String color = "black";

String[] taillepx = {"1px", "5px", "10px", "30px", "50px"};

public outil() {
this.setSize(200, 500);
Container contenu = getContentPane();
contenu.setLayout(new FlowLayout());


dessin = new JButton(new ImageIcon("src/image/crayon.png"));
contenu.add(dessin, "NORTH");
dessin.setPreferredSize(new Dimension (30, 30));
dessin.addActionListener(this);





supp = new JButton(new ImageIcon("src/image/lasso.png"));
contenu.add(supp, "NORTH");
supp.addActionListener(this);
supp.setPreferredSize(new Dimension (30, 30));
gomme = new JButton(new ImageIcon("src/image/gomme.png"));
contenu.add(gomme, "NORTH");
gomme.setPreferredSize(new Dimension (30, 30));
gomme.addActionListener(this);
couleur = new JButton(new ImageIcon("src/image/crayon.png")); //Le bouttons pour afficher la page
contenu.add(couleur, "NORTH");
couleur.setPreferredSize(new Dimension (30, 30));
couleur.addActionListener(this);
px = new JTextField("Taille", 10);
contenu.add(px, "SOUTH");
px.setEditable(true);


}
public static String pixel;
public static JTextField px;


public static void main(String[] args) {



}

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
Object source = arg0.getSource();
if(source == supp) {
outil = 2;
System.out.println(outil);

}else {
if(source == gomme) {
outil = 3;
System.out.println(outil);
}else {
if(source == dessin) {
outil = 1;
}else {
if(source == couleur) { //Afficher la page des couleurs
Color couleur2 = JColorChooser.showDialog
(null, "couleur du fond", Color.WHITE);
}
}
}
}
}



private JButton dessin,gomme,couleur,supp;
//private JComboBox px;

}


Mon Fenetre.java (le JFrame de la fenetre ou l'on dessine):


package Fenetre;


import java.awt.Color;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

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



et mon dessin.java (mon JPanel)


package Fenetre;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JPanel;



public class dessin extends JPanel implements MouseListener,MouseMotionListener{


public static int x1, y1, x2, y2;

public dessin(JPanel pan) {
this.pan=pan;



}




private JPanel pan;
public static void main(String[] args) {
// TODO Auto-generated method stub

}


public void mouseDragged(MouseEvent e) {
String pixel = outil.px.getText();
int px;
px = Integer.parseInt(pixel);
if(outil.outil == 1) {
Graphics g = pan.getGraphics();
//Je veux ici recuperer la couleur du JColorChooser g.setColor();
g.fillOval(e.getX(), e.getY(), px, px);
}else {
if(outil.outil == 3) {
Graphics g = pan.getGraphics();
g.setColor(Color.white);
g.fillOval(e.getX(),e.getY(), px, px);
}

}
}


@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
Object source = e.getSource();
}
private JColorChooser couleur2;
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub

}

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

}

@Override
public void mousePressed(MouseEvent ev) {

if(outil.outil == 2) {
x1 = ev.getX();
y1 = ev.getY();
Graphics g = pan.getGraphics();
// Je veux ici recuperer la couleur du JColorChooser g.setColor();
g.fillOval(x1, y1, 1, 1);

}

}


@Override
public void mouseReleased(MouseEvent ev) {
// TODO Auto-generated method stub
if(outil.outil == 2) {
x2 = ev.getX();
y2 = ev.getY();
Graphics g = pan.getGraphics();
//Je veux ici recuperer la couleur du JColorChooser g.setColor();
g.drawLine(x1, y1, x2, y2);

}
}


@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub

}
}



Donc voila j'espere que je pourrais avoir de l'aide pour savoir quoi mettre dans les g.setColor();

Merci D'avance :D
(Ps les public static ne marche pas pour un Color):)
Afficher la suite 

14 réponses

Répondre au sujet
Twinuts 5251 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 30 octobre 2017 Dernière intervention - 24 juil. 2017 à 08:29
0
Utile
Salut,

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.


Commenter la réponse de Twinuts
0
Utile
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
Commenter la réponse de Siloze
Twinuts 5251 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 30 octobre 2017 Dernière intervention - Modifié par Twinuts le 25/07/2017 à 19:02
0
Utile
11
Salut,

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 ..." 
Siloze > Twinuts 5251 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 30 octobre 2017 Dernière intervention - 26 juil. 2017 à 13:13
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 ^^
Siloze 4 Messages postés samedi 22 juillet 2017Date d'inscription 26 juillet 2017 Dernière intervention > Twinuts 5251 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 30 octobre 2017 Dernière intervention - 26 juil. 2017 à 15:25
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
Twinuts 5251 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 30 octobre 2017 Dernière intervention > Siloze 4 Messages postés samedi 22 juillet 2017Date d'inscription 26 juillet 2017 Dernière intervention - 26 juil. 2017 à 15:59
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.
Siloze 4 Messages postés samedi 22 juillet 2017Date d'inscription 26 juillet 2017 Dernière intervention > Twinuts 5251 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 30 octobre 2017 Dernière intervention - 26 juil. 2017 à 16:25
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 --'
Twinuts 5251 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 30 octobre 2017 Dernière intervention > Siloze 4 Messages postés samedi 22 juillet 2017Date d'inscription 26 juillet 2017 Dernière intervention - 26 juil. 2017 à 17:37
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
Commenter la réponse de Twinuts

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.