Java Swing问题 – 使用调色板

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

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

我通过Java Reflection实现了这个:(适用于在java.awt.Color定义的static final 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

在这种情况下,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"; } ... 

对于固定的调色板, enum是一个合理的选择,在上下文中显示:

 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 。 您可能还想了解如何使用颜色选择器:创建自定义选择器面板 。 最后,您可能需要考虑使用现有的标准颜色名称 。

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

NTC.java是用main()方法编写的,因此可以在命令shell中独立测试它:

 > java us.r0k.ntc.NTC 28f369
 >#0BDA51,孔雀石,假

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

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

 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