user3307916
user3307916

Reputation: 1

how to draw colors

Ok so I have my main class which got some buttons one for a triangle and the other for an

oval and boxes.

And i got a button for ColorChooser I want to click on it and ColorChooser show up. I have

the class for the oval and triangles and ColorChooser and i set each one of them to a mode

in my main program.

So this is my main program with only the boxes and ColorChooser:

As you can see im using modes for each button and i set mode 4 for ColorChooser

If you want me to add the box class or the ColorChooser class i will if it is not making

sense. I just dont want it to be any longer.

This is my main program:

import java.awt.*;

import java.util.ArrayList;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.ChangeEvent;


public class Kaleidescope extends JFrame implements MouseListener, ActionListener, 

MouseMotionListener

{

   Box b;

   ArrayList<Box> boxes; // list of boxes

   ColorChooser oo;

   ColorChooser[] colors;

   int colorCount;

   // Buttons 

   JButton boxButton;

   JButton ColorButton;

   int x1, y1; // mousePressed

   int w1, z1; // mouseEntered

   int mode =1; // 1 = line, 2= boxes, 3 = oval, 4= text, 5 = SG, twoLines = 7. 

   public static void main( String[] args )

   {
      System.out.println("hi there.");

      new Kaleidescope();
   }

   public Kaleidescope()

   {
      setDefaultCloseOperation( EXIT_ON_CLOSE );

      addMouseListener(this);

      addMouseMotionListener(this);

      boxes = new ArrayList<Box>(); 

      colors = new ColorChooser[20];

      colorCount = 0;

      setLayout( new FlowLayout() );

      boxButton = new JButton("Boxes");

      add(boxButton);

      boxButton.addActionListener( this );

      ColorButton = new JButton("Color Chooser");

      add(ColorButton);

      ColorButton.addActionListener( this);

      setSize( new Dimension(500,500) );

      setVisible(true);

   }

   // returns a random color

   public Color randomColor()

   {

      int red = (int)(Math.random()*255);

      int green = (int)(Math.random()*255);

      int blue = (int)(Math.random()*255);

      return new Color(red,green,blue);

   }

   public void mouseClicked( MouseEvent e )

   {

      // box

      if ( mode == 2)

      {

          boxes.add(new Box(e.getX(), e.getY(), randomColor()));
      }


      repaint();
   }

   //action performed

   public void actionPerformed( ActionEvent e )

   {

       if      ( e.getSource()==TriangleButton ) { mode  = 1;}

       else if ( e.getSource()==boxButton ) { mode = 2;}

       else if ( e.getSource()==ovalButton) { mode = 3;}

       else if ( e.getSource()==ColorButton) { mode = 4;}

       //clear all

        else if (e.getSource() == clearButton)

        {
            boxes.clear();
                triangles.clear();
                ovals.clear();

        }

      repaint();   

   }
   public void mouseEntered( MouseEvent e ) { }

   public void mousePressed( MouseEvent e )  { }

   public void mouseExited( MouseEvent e ) { }

   public void mouseReleased( MouseEvent e ) {}

   public void mouseMoved( MouseEvent e ) {}

   public void mouseDragged( MouseEvent e ){ }
   }

   public void paint( Graphics g )

   {
      //draw/paint box triangle and oval

      super.paint(g);

      for (Box box : boxes) 
      {
            box.drawMe(g);
      }
    }
}

here is my colorChooser class:

    import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

import javax.swing.colorchooser.*;

public class ColorChooser extends JPanel implements ChangeListener 

{

    public static final long serialVersionUID = 1L;

    public JColorChooser tcc;

        public JLabel banner;

    public ColorChooser() 

    {
        super(new BorderLayout());

        banner = new JLabel("",JLabel.CENTER);

        banner.setOpaque(true);

        banner.setPreferredSize(new Dimension(100, 65));

        JPanel bannerPanel = new JPanel(new BorderLayout());

        bannerPanel.add(banner, BorderLayout.CENTER);

        bannerPanel.setBorder(BorderFactory.createTitledBorder("Banner"));

        //Set up color chooser for setting text color

        tcc = new JColorChooser(banner.getForeground());

        tcc.getSelectionModel().addChangeListener(this);

        tcc.setBorder(BorderFactory.createTitledBorder("Choose Text Color"));

        add(bannerPanel, BorderLayout.CENTER);

        add(tcc, BorderLayout.PAGE_END);
    }

    public void stateChanged(ChangeEvent e)

    {
        Color newColor = tcc.getColor();

        banner.setForeground(newColor);
    }


    private static void createAndShowGUI() 

    {
        //Create and set up the window.

        JFrame frame = new JFrame("ColorChooserDemo");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.

        JComponent newContentPane = new ColorChooser();

        newContentPane.setOpaque(true); //content panes must be opaque

        frame.setContentPane(newContentPane);

        //Display the window.

        frame.pack();

        frame.setVisible(true);
    }

    public static void main(String[] args) 

    {
        javax.swing.SwingUtilities.invokeLater(new Runnable() 

        {
            public void run() 

            {
                createAndShowGUI();
            }
        });
    }

}

Upvotes: 0

Views: 551

Answers (3)

Paul Samsotha
Paul Samsotha

Reputation: 209132

Here's a runnable example of how JColorChooser can be used to set the color for different tasks. Feel free to ask questions if you are unclear about anything.

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
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;
import javax.swing.SwingUtilities;

public class ColorChooserPaintExample {

    private Color color = Color.BLUE;
    private ColorPanel colorPanel = new ColorPanel();

    public ColorChooserPaintExample() {
        final JFrame frame = new JFrame("My Color Chooser Demo");

        JButton chooseColor = new JButton("Change Color of Panel");
        chooseColor.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                color = JColorChooser.showDialog(frame, "Choose a Color for Panel", color);
                colorPanel.repaint();
            }
        });

        frame.add(colorPanel);
        frame.add(chooseColor, BorderLayout.SOUTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);   
    }

    private class ColorPanel extends JPanel {

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

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 300);
        }
    }

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

Upvotes: 2

MadProgrammer
MadProgrammer

Reputation: 347332

Start by taking a look at How to Write an Action Listener and How to Use Color Choosers

Basically, attach a ActionListener to the JButton you want to activate the JColorChooser and when the actionPerformed method is called, use inbuilt functionality to show the default chooser window, for example (from the linked tutorial)...

Color newColor = JColorChooser.showDialog(
                    ColorChooserDemo2.this,
                    "Choose Background Color",
                    banner.getBackground());

Updated

Start by adding a Color instance variable to Kaleidescope, this will allow you to maintain a reference to the last chossen color

private Color currentPaintColor = Color.BLACK;

Next, when the ColorButton is pressed, you will want to create some kind of dialog to show the chooser in, this will allow you to wait until the user chooses a color and get the resulting color...

} else if (e.getSource() == ColorButton) {
    ColorChooser chooser = new ColorChooser();
    int result = JOptionPane.showConfirmDialog(this, chooser, "Color Chooser", JOptionPane.OK_CANCEL_OPTION);
    if (result == JOptionPane.OK_OPTION) {
        currentPaintColor = chooser.getChoosenColor();
    }
} //clear all

You'll also want to change the stateChanged method in ColorChooser to make it more meaningful...

public void stateChanged(ChangeEvent e) {
    Color newColor = tcc.getColor();

    banner.setBackground(newColor);
}

Now, the question is, what do you want to do with this new color? Do you want to apply it to all the current shapes you are painting? If so you need to set the color before painting the shapes...

public void paint(Graphics g) {
    //draw/paint box triangle and oval
    super.paint(g);
    g.setColor(currentPaintColor);
    for (Box box : boxes) 
    {
        box.drawMe(g);
    }
}

Or do you only want to apply the color to new objects added after the change?

You should avoid overriding paint of top level containers, lots of reason, they aren't double buffered, which will cause flickering when they are updated and you will be painting over the top of everything else on the frame and you can potentially paint under the frame borders...

Instead you should use something JPanel and override it's paintComponent method, take a look at Performing Custom Painting for more details

Upvotes: 4

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285460

You need to clarify just what you expect a mode = 4 will do with your program. I can understand using JButton presses to set shape modes (object state) that will alter the behavior of your MouseListener, but I don't see how a color chooser will fit into this model, and in fact believe that it likely won't. I don't have the rest of your code, nor do I have the specifics of your assignment, but I'm going to make some recommendations based on guesses, and thus these will necessarily be weak recommendations.

  • I'm guessing that you want to have a JColorChooser dialog displayed when the color button is pressed.
  • And that the user then can select a Color that will be the color of the drawn shapes.
  • If so, then likely you shouldn't have the color chooser button (which should be named colorChooserButton) set a numeric node. Rather, it should open your color choosing dialog, and after the user has selected a color, then you should set a Color field in your drawing class, not the mode value.
  • Rather the modes should only be used to select an appropriate shape that the MouseListener will use to determine what shape to draw.
  • Myself, I wouldn't use numeric modes but rather an enum to define this state, but that is probably something you'll learn later in your programming education.

If my assumptions are incorrect, then please clarify them.

As an aside, note that you should not draw in a paint(Graphics g) method, and should not draw directly in the JFrame. Rather you should draw in the paintComponent(Graphics g) method override of a JPanel or JComponent.

Upvotes: 3

Related Questions