如何画出颜色

时间:2014-02-19 01:01:48

标签: java swing

好的,所以我的主要课程有一个按钮,一个是三角形,另一个是

椭圆形和盒子。

我有一个ColorChooser按钮,我想点击它,ColorChooser出现。我有

椭圆形和三角形的类以及ColorChooser和我将它们中的每一个设置为模式

在我的主程序中。

所以这是我的主程序,只有盒子和ColorChooser:

正如您所看到我使用每个按钮的模式而我为ColorChooser设置了模式4

如果你想让我添加盒子类或ColorChooser类,如果它没有制作

感。我只是不想再这样了。

这是我的主要计划:

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

这是我的colorChooser类:

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

}

3 个答案:

答案 0 :(得分:4)

首先看看How to Write an Action ListenerHow to Use Color Choosers

基本上,将ActionListener附加到要激活JButton的{​​{1}},并在调用JColorChooser方法时,使用内置功能显示默认选择窗口,例如(来自链接教程)......

actionPerformed

<强>更新

首先将Color newColor = JColorChooser.showDialog( ColorChooserDemo2.this, "Choose Background Color", banner.getBackground()); 实例变量添加到Color,这样您就可以保留对最后一个chossen颜色的引用

Kaleidescope

接下来,当按下private Color currentPaintColor = Color.BLACK; 时,您需要创建某种对话框以显示选择器,这将允许您等到用户选择颜色并获得结果颜色...

ColorButton

您还希望更改} 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 中的stateChanged方法,使其更有意义......

ColorChooser

现在,问题是,你想用这种新颜色做什么?您想将它应用于您正在绘制的所有当前形状吗?如果是这样,你需要在绘制形状之前设置颜色......

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

    banner.setBackground(newColor);
}

或者您只想将颜色应用于更改后添加的新对象吗?

你应该避免覆盖public void paint(Graphics g) { //draw/paint box triangle and oval super.paint(g); g.setColor(currentPaintColor); for (Box box : boxes) { box.drawMe(g); } } 顶级容器,有很多理由,它们不会被双重缓冲,这会在更新后导致闪烁,并且你将在其他所有内容上绘制框架,您可以在框架边框下绘画...

相反,您应该使用某些paint并覆盖它的JPanel方法,请查看Performing Custom Painting了解更多详情

答案 1 :(得分:3)

您需要澄清您对程序的模式= 4的期望。我可以理解使用JButton印刷机设置 形状 模式(对象状态)将改变MouseListener的行为,但我没有看到颜色选择器如何适应这个模型,实际上相信它可能不会。我没有其余的代码,也没有你的任务细节,但我会根据猜测提出一些建议,因此这些建议必然是弱的。

  • 我猜你想在按下颜色按钮时显示一个JColorChooser对话框。
  • 然后用户可以选择颜色作为绘制形状的颜色。
  • 如果是这样,那么很可能你不应该让颜色选择器按钮(应该命名为colorChooserButton)设置一个数字节点。相反,它应该打开你的颜色选择对话框,并在用户选择了颜色后,你应该在你的绘图类中设置一个颜色字段,而不是模式值。
  • 而是仅应使用模式选择MouseListener将用于确定要绘制的形状的适当形状。
  • 我自己,我不会使用数字模式,而是使用枚举来定义这种状态,但这可能是您稍后将在编程教育中学到的内容。

如果我的假设不正确,请澄清它们。

另外,请注意,您不应使用paint(Graphics g)方法绘制,也不应直接在JFrame中绘制。相反,您应该使用JPAnel或JComponent的paintComponent(Graphics g)方法覆盖。

答案 2 :(得分:2)

这是一个可运行的示例,说明JColorChooser如何用于设置不同任务的颜色。如果您不清楚任何事情,请随时提问。

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