diff --git a/designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPicker.png b/designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPicker.png new file mode 100644 index 000000000..fc88b3bfc Binary files /dev/null and b/designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPicker.png differ diff --git a/designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPickerCustom.png b/designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPickerCustom.png new file mode 100644 index 000000000..afe0cd8eb Binary files /dev/null and b/designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPickerCustom.png differ diff --git a/designer_base/src/com/fr/design/style/color/ColorPicker.java b/designer_base/src/com/fr/design/style/color/ColorPicker.java new file mode 100644 index 000000000..4d2300099 --- /dev/null +++ b/designer_base/src/com/fr/design/style/color/ColorPicker.java @@ -0,0 +1,205 @@ +package com.fr.design.style.color; + +/** + * Created by plough on 2016/12/22. + */ +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.Ellipse2D; +import java.awt.image.BufferedImage; +import javax.swing.*; + +/** + * 取色框 + */ +public class ColorPicker extends JDialog implements ActionListener +{ + private Container container = getContentPane(); // 主容器 + private int setCoordinateX; // 取色框x坐标 + private int setCoordinateY; // 取色框y坐标 + private int colorPickerSize = 190; // 取色框尺寸 + private int scaleFactor = 16; // 放大倍数 + private ColorPickerPanel colorPickerPanel = new ColorPickerPanel(scaleFactor); // 取色框内容面板 + + private Timer timer; // 用于定时重绘 + private int FPS = 45; // 重绘取色器的频率 + + private ColorSelectable colorSelectable; + private Point mousePos; // 鼠标的绝对坐标 + private Color colorToSet; // 暂存要设置的颜色值 + + /** + * 构造函数,创建一个取色框窗体 + */ + public ColorPicker(ColorSelectable colorSelectable) + { + setUndecorated(true); // 去掉窗体边缘 + setResizable(false); + Shape shape = new Ellipse2D.Double(0, 0, colorPickerSize, colorPickerSize); + setShape(shape); + container.add(colorPickerPanel); + addMouseListener(new MouseFunctions()); + addMouseMotionListener(new MouseMotionFunctions()); + updateSize(colorPickerSize); + this.colorSelectable = colorSelectable; + this.setAlwaysOnTop(true); + this.setVisible(true); + this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + } + + public void start() { + timer = new Timer(1000/FPS, this); + timer.start(); + } + + /** + * 执行Timer要执行的部分, + */ + @Override + public void actionPerformed(ActionEvent e) { + updateLocation(); + colorToSet = colorPickerPanel.getPixelColor(mousePos); + } + + public void updateLocation() { + mousePos = MouseInfo.getPointerInfo().getLocation(); + setCoordinateX = mousePos.x - getSize().width/2; + setCoordinateY = mousePos.y- getSize().height/2; + colorPickerPanel.setMagnifierLocation(setCoordinateX, + setCoordinateY); + setLocation(setCoordinateX, setCoordinateY); + } + + /** + * 更新窗体 + * + * @param colorPickerSize 取色框尺寸 + */ + public void updateSize(int colorPickerSize) + { + colorPickerPanel.setColorPickerSize(colorPickerSize); + setSize(colorPickerSize, colorPickerSize); + validate(); // 更新所有子控件 + } + + public void pickComplete() { + timer.stop(); + colorSelectable.setColor(colorToSet); + this.dispose(); + } + + // 隐藏鼠标光标 + public void hideCursor() { + Image imageCursor = Toolkit.getDefaultToolkit().getImage(""); +// Image img = new BufferedImage() + Cursor cu = Toolkit.getDefaultToolkit().createCustomCursor(imageCursor, new Point(0,0), "cursor"); +// setCursor(Toolkit.getDefaultToolkit().createCustomCursor( +// imageCursor, new Point(16, 16), "stick")); + setCursor(cu); + } + + private class MouseFunctions extends MouseAdapter + { + public void mousePressed(MouseEvent e) + { + pickComplete(); + } + } + + private class MouseMotionFunctions extends MouseMotionAdapter + { +// public void mouseMoved(MouseEvent e) { +// hideCursor(); +// } + } +} + +class ColorPickerPanel extends JPanel +{ + private BufferedImage screenImage; + private int colorPickerSize; // 取色框尺寸 + private int locationX; // 取色框 x 坐标 + private int locationY; // 取色框 y 坐标 + private int scaleFactor; // 放大倍数 + private Robot robot; + + /** + * 带参数的构造函数 + * @param scaleFactor 放大倍数 + */ + public ColorPickerPanel(int scaleFactor) + { + try + { + robot = new Robot(); + } + catch (AWTException e) + { + } + // 截屏幕 + screenImage = robot.createScreenCapture(new Rectangle(0, 0, Toolkit + .getDefaultToolkit().getScreenSize().width, Toolkit + .getDefaultToolkit().getScreenSize().height)); + this.scaleFactor = scaleFactor; + } + + /** + * 设置取色框的位置 + * @param locationX x坐标 + * @param locationY y坐标 + */ + public void setMagnifierLocation(int locationX, int locationY) + { + this.locationX = locationX; + this.locationY = locationY; + repaint(); // 注意重画控件 + } + + public Color getPixelColor(Point mousePos) { + int rgb = screenImage.getRGB(mousePos.x, mousePos.y); + int R = (rgb & 0xff0000) >> 16; + int G = (rgb & 0xff00) >> 8; + int B = (rgb & 0xff); + return new Color(R, G, B); + } + + public void setColorPickerSize(int colorPickerSize) + { + this.colorPickerSize = colorPickerSize; + } + + public void paintComponent(Graphics g) + { + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); + double pixelCount = (double)colorPickerSize / scaleFactor; // 取色器一条边上的放大后的像素点个数(可以是小数) + // 关键处理代码 + g2d.drawImage( + screenImage, // 要画的图片 + 0, // 目标矩形的第一个角的x坐标 + 0, // 目标矩形的第一个角的y坐标 + colorPickerSize, // 目标矩形的第二个角的x坐标 + colorPickerSize, // 目标矩形的第二个角的y坐标 + locationX + (int)((colorPickerSize - pixelCount) * 0.5) + 1, // 源矩形的第一个角的x坐标 + locationY + (int)((colorPickerSize - pixelCount) * 0.5) + 1, // 源矩形的第一个角的y坐标 + locationX + (int)((colorPickerSize + pixelCount) * 0.5) + 1, // 源矩形的第二个角的x坐标 + locationY + (int)((colorPickerSize + pixelCount) * 0.5) + 1, // 源矩形的第二个角的y坐标 + this + ); + + g2d.setColor(Color.black); + g2d.drawOval(0, 0, 190, 190); + g2d.setColor(Color.white); + g2d.drawOval(1, 1, 188, 188); + g2d.drawOval(2, 2, 186, 186); + g2d.setColor(Color.black); + g2d.drawOval(3, 3, 184, 184); + + g2d.setColor(Color.white); + g2d.drawRect(86, 86, 18, 18); + g2d.setColor(Color.black); + g2d.drawRect(87, 87, 16, 16); + } + + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/style/color/NewColorSelectPane.java b/designer_base/src/com/fr/design/style/color/NewColorSelectPane.java index bbecf01d3..2b71357a8 100644 --- a/designer_base/src/com/fr/design/style/color/NewColorSelectPane.java +++ b/designer_base/src/com/fr/design/style/color/NewColorSelectPane.java @@ -17,6 +17,7 @@ import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import com.fr.base.BaseUtils; import com.fr.design.constants.UIConstants; import com.fr.design.border.UIRoundedBorder; import com.fr.design.gui.ibutton.UIButton; @@ -78,10 +79,29 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable { // center JPanel centerPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); this.add(centerPane, BorderLayout.CENTER); - + + // 第一行,1个取色按钮 + 7个最近使用的颜色 + JPanel row1Pane = new JPanel(FRGUIPaneFactory.createBorderLayout()); + row1Pane.setBorder(BorderFactory.createEmptyBorder(8, 8, 0, 0)); + row1Pane.setPreferredSize(new Dimension(135, 16)); // 宽度为 16 * 8 + 7 + centerPane.add(row1Pane); + + // 取色按钮 + UIButton pickColorButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/gui/colorSelectPane/colorPicker.png")); + pickColorButton.setPreferredSize(new Dimension(16, 16)); + pickColorButton.setCursor(new Cursor(Cursor.HAND_CURSOR)); + pickColorButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + doPickColor(); + } + }); + row1Pane.add(pickColorButton, BorderLayout.WEST); + // 最近使用 - usedColorPane = new UsedColorPane(1, 8, ColorSelectConfigManager.getInstance().getColors(),this); - centerPane.add(usedColorPane.getPane()); + usedColorPane = new UsedColorPane(1, 7, ColorSelectConfigManager.getInstance().getColors(),this); + usedColorPane.getPane().setBorder(BorderFactory.createEmptyBorder(0, 1, 0, 8)); + row1Pane.add(usedColorPane.getPane()); JPanel menuColorPane1 = new JPanel(); centerPane.add(menuColorPane1); @@ -204,4 +224,12 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable { usedColorPane.updateUsedColor(); } + /** + * 打开取色框,开始取色 + */ + public void doPickColor() { + ColorPicker colorPicker = new ColorPicker(this); + colorPicker.start(); + } + } \ No newline at end of file