2011-12-17 21 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