2016-01-26 3 views
1

J'ai des problèmes pour changer les couleurs d'une certaine forme. Mais quand l'utilisateur clique sur un menuitem, il va changer avec succès dans une autre forme. Maintenant, le problème est que je ne peux pas penser à une solution qui va résoudre celui-ci. Quelqu'un peut-il m'aider à ce sujet? L'aide est très appréciée. Je vous remercie.comment changer de forme et de couleurs en cliquant sur menuitems en java

@Override 
    public void paintComponent(Graphics shapes) 
    { 
     super.paintComponent(shapes); 
     switch(colorNo) 
     { 
      case 0 : color = Color.RED;break; 
      case 1 : color = Color.BLUE;break; 
      case 2 : color = Color.MAGENTA;break; 
     } 
     switch(numbers) 
     { 
      case 0 : circle(shapes);break; 
      case 1 : rectangle(shapes);break; 
      case 2 : square(shapes);break; 
      case 3 : triangle(shapes);break; 
     } 
    } 

    public void circle(Graphics shapes) 
    { 
     shapes.setColor(color); 
     shapes.fillOval(250,100, 100, 100); 
    } 


    @Override 
    public void actionPerformed(ActionEvent click) { 
     if(click.getSource() == circle){ 
      numbers = 0; 
      repaint(); 
     }else if(click.getSource() == square){ 
      numbers = 1; repaint(); 
     }else if(click.getSource() == rectangle){ 
      numbers = 2; repaint(); 
     }else if(click.getSource() == triangle){ 
      numbers = 3; repaint(); 
     } 
     if(click.getSource() == red){ 
      colorNo = 0; repaint(); 
     } 

    } 

Répondre

2

simple - dans votre méthode de paintComponent, après appel de paintComponent de votre super et avant votre instruction switch où vous définissez la forme, définissez la couleur de l'objet graphique, de la même manière que vous définissez la forme. Vous devrez bien sûr ajouter un écouteur à chacun de vos éléments de menu de couleur pour que cela fonctionne.

C'est beaucoup plus facile et plus propre si vous utilisez AbstractActions au lieu de tout partager le même ActionListener. Par exemple, ce code ne fait pas exactement ce que vous essayez de faire, mais il peut vous donner quelques idées.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 


public class MyShapes extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 
    private JMenuBar menuBar = new JMenuBar(); 
    private Color color = Color.WHITE; 

    public MyShapes() { 
     JMenu colorMenu = new JMenu("Color"); 
     colorMenu.add(new JMenuItem(new ColorAction("Black", Color.BLACK))); 
     colorMenu.add(new JMenuItem(new ColorAction("White", Color.WHITE))); 
     colorMenu.add(new JMenuItem(new ColorAction("Red", Color.RED))); 
     colorMenu.add(new JMenuItem(new ColorAction("Blue", Color.BLUE))); 
     colorMenu.add(new JMenuItem(new ColorAction("Green", Color.GREEN))); 
     menuBar.add(colorMenu); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(color); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    public JMenuBar getMenuBar() { 
     return menuBar; 
    } 

    private class ColorAction extends AbstractAction { 
     private Color actionColor; 

     public ColorAction(String name, Color color) { 
      super(name); 
      this.actionColor = color; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      color = actionColor; 
      repaint(); 
     } 
    } 

    private static void createAndShowGui() { 
     MyShapes mainPanel = new MyShapes(); 

     JFrame frame = new JFrame("MyShapes"); 
     frame.setJMenuBar(mainPanel.getMenuBar()); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 

Notez que vous pouvez dessiner vos formes de la même manière - en remplissant une variable à partir de la méthode actionPerformed de l'action de l'élément de menu. Seulement cette fois la variable qui est du type d'interface DrawShape et l'utilisera pour sa méthode, ici public void draw(Graphics g). Ce type de modèle de conception de programme est appelé Command Pattern. Par exemple:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Polygon; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class MyShapes extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 
    private JMenuBar menuBar = new JMenuBar(); 
    private Color color = null; 
    public DrawShape drawShape = null; 

    public MyShapes() { 
     // create and fill colorMenu 
     JMenu colorMenu = new JMenu("Color"); 
     colorMenu.add(new JMenuItem(new ColorAction("Black", Color.BLACK))); 
     colorMenu.add(new JMenuItem(new ColorAction("White", Color.WHITE))); 
     colorMenu.add(new JMenuItem(new ColorAction("Red", Color.RED))); 
     colorMenu.add(new JMenuItem(new ColorAction("Blue", Color.BLUE))); 
     colorMenu.add(new JMenuItem(new ColorAction("Green", Color.GREEN))); 

     // create and fill shapeMenu 
     JMenu shapeMenu = new JMenu("Shape"); 
     shapeMenu.add(new JMenuItem(new DrawShapeAction("Square", new DrawShape() { 

      @Override 
      public void draw(Graphics g) { 
       int x = getWidth()/4; 
       int y = getHeight()/4; 
       int width = getWidth()/2; 
       int height = getHeight()/2; 
       g.fillRect(x, y, width, height); 
      } 
     }))); 
     shapeMenu.add(new JMenuItem(new DrawShapeAction("Circle", new DrawShape() { 

      @Override 
      public void draw(Graphics g) { 
       int x = getWidth()/4; 
       int y = getHeight()/4; 
       int width = getWidth()/2; 
       int height = getHeight()/2; 
       g.fillOval(x, y, width, height); 
      } 
     }))); 
     shapeMenu.add(new JMenuItem(new DrawShapeAction("Triangle", new DrawShape() { 

      @Override 
      public void draw(Graphics g) { 
       int[] x = new int[3]; 
       int[] y = new int[3]; 
       x[0] = getWidth()/4; 
       x[1] = getWidth()/2; 
       x[2] = 3 * getWidth()/4; 
       y[0] = 3 * getHeight()/4; 
       y[1] = getHeight()/4; 
       y[2] = y[0]; 
       Polygon polygon = new Polygon(x, y, 3); 
       g.fillPolygon(polygon); 
      } 
     }))); 

     // add both JMenus to the JMenuBar 
     menuBar.add(colorMenu); 
     menuBar.add(shapeMenu); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     // if either color or drawShape are not set, exit this method and draw nothing 
     if (color == null || drawShape == null) { 
      return; 
     } 

     // to smooth out the edges 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     // set color and call drawShape's draw method 
     g.setColor(color); 
     drawShape.draw(g); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    public JMenuBar getMenuBar() { 
     return menuBar; 
    } 

    private class ColorAction extends AbstractAction { 
     private Color actionColor; 

     public ColorAction(String name, Color color) { 
      super(name); 
      this.actionColor = color; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      MyShapes.this.color = actionColor; 
      repaint(); 
     } 
    } 

    private class DrawShapeAction extends AbstractAction { 
     private DrawShape actionDrawShape; 

     public DrawShapeAction(String name, DrawShape drawShape) { 
      super(name); 
      this.actionDrawShape = drawShape; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      MyShapes.this.drawShape = actionDrawShape; 
      repaint(); 
     } 
    } 

    private interface DrawShape { 
     void draw(Graphics g); 
    } 

    private static void createAndShowGui() { 
     MyShapes mainPanel = new MyShapes(); 

     JFrame frame = new JFrame("MyShapes"); 
     frame.setJMenuBar(mainPanel.getMenuBar()); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 
+0

Oui, il est plus propre –

+0

Je vais essayer de REFRACTOR mon code après avoir résolu le problème. J'ai mis à jour mon travail mais comment ça se fait que ça ne marche toujours pas .. Quand je clique sur le menuitem rouge rien ne se passe mais en cliquant sur le menuitem de forme fonctionne bien. Pouvez-vous vérifier cela en premier? –

+0

@JayGorio: Je ne vous vois pas ajouter d'écouteurs à vos éléments de menu de couleur. Où faites-vous cela? Ils ne fonctionneront pas comme par magie mais devront être branchés sur n'importe quoi. –