【问题标题】:Java Swing issue - Using color paletteJava Swing 问题 - 使用调色板
【发布时间】:2012-01-22 14:16:31
【问题描述】:

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

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

【问题讨论】:

  • "..don't know how to get the name of that selected color" 您是否希望 16,777,216 种可能的颜色中的每一种都有不同的名称,例如“红色”?
  • @AndrewThompson - 我的妻子知道其中的 16,777,200 种颜色。特别是在提到鞋子时。现在,如果我们能弄清楚如何在 Java Swing 中构建一个妻子模块......
  • @Perception 好吧,只有 digital 鞋子仅限于 256 种 R、G 和 B 色调。在现实世界中(即鞋店),全部 赌注取消。 ;)
  • 如果我没记错的话,来自 OTN 的 Swings Gurus 曾经使用过这个r0k.us/graphics/SIHwheel.html
  • @Perception 如果这样的模型是可能的,由于它的不确定性,它无论如何都是无用的:)

标签: java swing jcolorchooser


【解决方案1】:

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&lt;Color, String&gt;。您可能还想查看How to Use Color Choosers: Creating a Custom Chooser Panel。最后,您可能需要考虑使用现有的标准color names

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        我通过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

        【讨论】:

          【解决方案5】:
          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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-07
            • 2016-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-05
            • 1970-01-01
            • 2011-03-13
            相关资源
            最近更新 更多