Java Swing问题 - 使用调色板

时间:2011-12-17 12:02:51

标签: java swing jcolorchooser

我有一个问题 - 我选择了一种颜色后使用十六进制值存储在文本字段中(使用JColorChooser)。我想要做的是在十六进制值旁边的另一个文本字段中显示颜色的名称,但我不确定如何获取颜色名称?我包含了我的代码,也许有人可以给我一些有用的提示:

public class Main extends JComponent implements Accessible {
    public ColorSelectionModel selectionModel;
    public static final String SELECTION_MODEL_PROPERTY = "selectionModel";
    public JColorChooser chooser;
    public Color color;

    public void process() {
        JFrame frame;
        JButton button;
        final JTextField text1, text2;

        // Initialize variables
        chooser = new JColorChooser();
        frame = new JFrame();
        JPanel panel = new JPanel();
        button = new JButton("Show color Palette");
        text1 = new JTextField(20);
        text2 = new JTextField(20);

        // Setup UI
        frame.add(panel);
        panel.add(button);
        panel.add(text1);
        panel.add(text2);
        panel.add(chooser)
        chooser.setVisible(false);

        button.setLocation(800, 600);
        button.setActionCommand("");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                color = chooser.showDialog(chooser, "SHOW THE COLOR",
                        chooser.getColor());
                {
                    if (color != null) {
                        String hex = Integer.toHexString(color.getRGB() & 0xffffff);
                        hex = "#" + hex;
                        text1.setText(hex);
                    }
                }
            }
        });

        frame.setVisible(true);
        frame.setSize(1000, 800);
    }

    public static void main(String[] argv) {
        // Run the code
        Main m1 = new Main();
        m1.process();
    }
}

5 个答案:

答案 0 :(得分:2)

RGB在这种情况下不是最好的颜色模型。 HSB会更合适。

  1. 将RGB转换为HSB:

    float[] hsb = Color.RGBtoHSB(red, green, blue, null);
    
  2. 检测颜色:

    String color;
    
    if (hsb[0] >= 0.0 && ksb[0] <= 0.1) {
        color = "Red";
    } else if (hsb[0] > 0.1 && ksb[0] <= 0.25) {
        color = "Orange";
    } else if (hsb[0] > 0.25 && ksb[0] <= 0.35) {
        color = "Yellow";
    } ...
    

答案 1 :(得分:2)

对于修复调色板,enum是一个合理的选择,如上下文here所示:

private enum Hue {

    Cyan(Color.cyan), Magenta(Color.magenta), Yellow(Color.yellow),
    Red(Color.red), Green(Color.green), Blue(Color.blue);

    private final Color color;

    private Hue(Color color) {
        this.color = color;
    }

    public Color getColor() {
        return color;
    }
}

对于变量调色板,您需要定义与颜色和名称相关的数据结构,例如Map<Color, String>。您可能还想查看How to Use Color Choosers: Creating a Custom Chooser Panel。最后,您可能需要考虑使用现有的标准color names

答案 2 :(得分:2)

我通过mKorbel链接到我的Interactive Color Wheel找到了这个帖子。该applet包含一个Java端口和Chirag Mehta的Name That Color Javascript库的扩展。由于我最终添加了具有多个颜色名称字典的功能,因此我从源代码中删除了实际的十六进制/名称对,并将它们添加为属性文件。如果您想要的只是Chirag的颜色名称字典(几个较小的字典的混搭),您只需要前两个文件。

NTC.java使用main()方法编写,以便可以在命令shell中独立测试:

>java us.r0k.ntc.NTC 28f369
>  #0BDA51, Malachite, false

第一个值是与所需十六进制最接近的十六进制,第二个值是该值的颜色名称,第三个值表示未找到完全匹配。

您还可以指定第二个参数,颜色名称字典的名称(默认为“cnd_ntc.properties”)。

答案 3 :(得分:1)

我是通过Java Reflection实现的:(适用于static final Color中定义的java.awt.Color

这是我的代码:

public static String getNameReflection(Color colorParam) {
        try {
            //first read all fields in array
            Field[] field = Class.forName("java.awt.Color").getDeclaredFields();
            for (Field f : field) {
                String colorName = f.getName();
                Class<?> t = f.getType();
                // System.out.println(f.getType());
                // check only for constants - "public static final Color"
                if (t == java.awt.Color.class) {
                    Color defined = (Color) f.get(null);
                    if (defined.equals(colorParam)) {
                        System.out.println(colorName);
                        return colorName.toUpperCase();
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("Error... " + e.toString());
        }
        return "NO_MATCH";
    }

来源:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/java-reflection-getting-name-of-color.html

答案 4 :(得分:0)

public void updateChooser() {
    Color color = getColorFromModel();
    if (Color.red.equals(color)) {
        redCrayon.setSelected(true);
    } else if (Color.yellow.equals(color)) {
        yellowCrayon.setSelected(true);
    } else if (Color.green.equals(color)) {
        greenCrayon.setSelected(true);
    } else if (Color.blue.equals(color)) {
        blueCrayon.setSelected(true);
    }
}

选中http://docs.oracle.com/javase/tutorial/uiswing/components/colorchooser.html#chooserpanel