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

Siloze Messages postés 4 Date d'inscription samedi 22 juillet 2017 Statut Membre Dernière intervention 26 juillet 2017 - 22 juil. 2017 à 20:43
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 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):)
A voir également:

3 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
24 juil. 2017 à 08:29
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.


0
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
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
Modifié le 25 juil. 2017 à 19:02
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 ..." 
0
Siloze Messages postés 4 Date d'inscription samedi 22 juillet 2017 Statut Membre Dernière intervention 26 juillet 2017
25 juil. 2017 à 17:39
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.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111 > Siloze Messages postés 4 Date d'inscription samedi 22 juillet 2017 Statut Membre Dernière intervention 26 juillet 2017
Modifié le 25 juil. 2017 à 19:01
Re,

Mince j'ai envoyé sans remarquer que j'ai omis de copier le code de l'interface...

Je viens d'éditer l'exemple de code en ajoutant celui de l'interface.
0
Siloze > Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023
26 juil. 2017 à 00:15
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
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111 > Siloze
26 juil. 2017 à 08:39
Salut,

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...
0
Siloze > Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023
26 juil. 2017 à 10:25
Salut

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 ! :)
0
Rejoignez-nous