2011-12-17 109 views
2

我在这里有一个问题 - 我有一个十六进制值存储在一个文本框我选择一种颜色(JColorChooser的使用)之后。我想要做的是在另一个文本框中显示的名称,该文本框的右边有十六进制值,但我不确定如何获取颜色名称?我包括我的代码,也许有人可以给我一些有用的提示:的Java Swing问题 - 使用调色板

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

*“不知道如何获取所选颜色的名称“*您是否期望16,777,216种可能颜色中的每一种都有不同的名称,如”红色“? – 2011-12-17 12:29:58

+4

@安德鲁·汤普森 - 我的妻子知道这些颜色约为16777200。特别是当涉及鞋子时。现在,如果我们只能弄清楚如何建立一个妻子模块到Java Swing ... – Perception 2011-12-17 12:32:36

+0

@Perception好吧,只有**数字**鞋限于R,G和B的256色。在现实世界中出来(IE鞋店),*所有*赌注都关闭。 ;) – 2011-12-17 12:59:35

回答

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

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"; 
    } ... 
    
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

+0

非常好的建议+1 – mKorbel 2011-12-17 15:25:40

2

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

NTC.javamain()方法写入的,以便它可以在命令行上进行测试的独立:

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

的第一个值是最接近十六进制到所需的十六进制,第二是该值的颜色名称和第三表示没有精确匹配的结果。

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

+0

欢迎光临! – trashgod 2011-12-19 06:42:01

+0

@RichF在这里欢迎+1 – mKorbel 2011-12-19 17:20:52