【问题标题】:How to get hex web String from JavaFX ColorPicker color?如何从 JavaFX ColorPicker 颜色中获取十六进制 Web 字符串?
【发布时间】:2013-07-29 07:38:50
【问题描述】:

我在 JavaFX ColorPicker 中选择了颜色。现在我需要将它保存为十六进制字符串。我找到了this 方法,但对于JavaFX 不适用。 JavaFX 有自己的 Color 类,没有 getRGB() 方法,可以用作中介转换。

【问题讨论】:

    标签: colors hex javafx rgb


    【解决方案1】:

    这个脆弱的解决方案完美地解决了问题:

    // 8 symbols.
    String hex1 = Integer.toHexString(myColorPicker.getValue().hashCode()); 
    
    // With # prefix.
    String hex2 = "#" + Integer.toHexString(myColorPicker.getValue().hashCode()); 
    
    // 6 symbols in capital letters.
    String hex3 = Integer.toHexString(myColorPicker.getValue().hashCode()).substring(0, 6).toUpperCase();
    

    【讨论】:

    • 这是一个脆弱的解决方案。哈希码的生成依赖于实现,因此不能保证在以后的版本中它会起作用。 (例如,如果哈希码中包含另一个字段,例如 opacy。)
    • 不明智地依赖 hashCode() 的实现,因为 API 中没有指定实现。
    【解决方案2】:

    这个 为我工作

    MyColorPicker.getValue().toString().substring(2)
    

    【讨论】:

    • 不鼓励仅使用代码的答案。请添加一些解释,说明这是如何解决问题的,或者这与现有答案有何不同。 From Review
    • 你可以这样使用:String hexcolor = MyColorPicker.getValue().toString().substring(2);我的意思是,当您想将 ColorPicker 的值作为字符串获取时,您可以尝试这个 bcz,get getValue() 将返回以 0x....颜色的正确值
    • 不,依赖whatEverObject.toString()错误,总是
    【解决方案3】:

    一种浮点安全方法:

    // Helper method
    private String format(double val) {
        String in = Integer.toHexString((int) Math.round(val * 255));
        return in.length() == 1 ? "0" + in : in;
    }
    
    public String toHexString(Color value) {
        return "#" + (format(value.getRed()) + format(value.getGreen()) + format(value.getBlue()) + format(value.getOpacity()))
                .toUpperCase();
    }
    

    由于浮点表示和强制转换,currently top voted answer 对于许多可能的Color 对象实际上并不安全。使用Math.round(...) 可以解决这个问题。

    我使用Color.hsb(...) 方法使用随机双精度(来自Math.random())生成Color 对象。如果不使用Math.round(),则转换后的十六进制代码将关闭。如果您采用类似的方法来生成颜色,建议使用此方法,因为它更安全。

    【讨论】:

      【解决方案4】:

      目前接受的答案

      return String.format("#%02X%02X%02X",
          ((int)color.getRed())*255,
          ((int)color.getGreen())*255,
          ((int)color.getBlue())*255);
      

      目前可用的答案中最有效的是 Zon 的(以下供参考)

      // 8 symbols.
        String hex1 = Integer.toHexString(myColorPicker.getValue().hashCode());
      
      // With # prefix.
        String hex2 = "#" + Integer.toHexString(myColorPicker.getValue().hashCode()); 
      
      // 6 symbols in capital letters.
        String hex3 = Integer.toHexString(myColorPicker.getValue().hashCode()).substring(0, 6).toUpperCase();
      

      但是,此方法会遇到自动删除起始零的问题。如果颜色的十六进制值以 0 开头(例如 #000000、#00A3FF 等),则会自动删除开头的零,使字符串太短而无法完全用作十六进制代码。 Color.BLACK 生成十六进制“#FF”,因为它只保持其不透明度。下面的方法,从 JavaFX 8u112 开始,完全解决了颜色到十六进制的转换。

      String colorToHex(Color color) {
          String hex1;
          String hex2;
      
          hex1 = Integer.toHexString(color.hashCode()).toUpperCase();
      
          switch (hex1.length()) {
          case 2:
              hex2 = "000000";
              break;
          case 3:
              hex2 = String.format("00000%s", hex1.substring(0,1));
              break;
          case 4:
              hex2 = String.format("0000%s", hex1.substring(0,2));
              break;
          case 5:
              hex2 = String.format("000%s", hex1.substring(0,3));
              break;
          case 6:
              hex2 = String.format("00%s", hex1.substring(0,4));
              break;
          case 7:
              hex2 = String.format("0%s", hex1.substring(0,5));
              break;
          default:
              hex2 = hex1.substring(0, 6);
          }
          return hex2;
      }
      

      希望这能帮我解决我遇到的麻烦!

      【讨论】:

      • 您的第一个解决方案在每个 Java 版本上只产生零,因为强制转换具有更高的优先级,因此您基本上总是乘以 0 * 255
      【解决方案5】:

      您可以使用getGreen()getBlue()getRed() 方法并将其转换为十六进制。

          Color c;
          int green = c.getGreen()*255;
          Integer.toHexString(green);
      

      对红色和蓝色重复此操作:

          String hexColor = "#"+red+green+blue;
      

      这是思路,完整代码(可复制粘贴):

          public class TestColor {
      
              public TestColor() {
                  Color c = Color.ALICEBLUE;
      
                   int green = (int) (c.getGreen()*255);
                   String greenString = Integer.toHexString(green);
      
                   int red = (int) (c.getRed()*255);
                   String redString = Integer.toHexString(red);
      
                   int blue = (int) (c.getBlue()*255);
                   String blueString = Integer.toHexString(blue);
      
                   String hexColor = "#"+redString+greenString+blueString;
                   System.out.println(hexColor);
                   System.out.println(c.toString());
              }
              public static void main(String[] args) {
                  new TestColor();
              }
          }
      

      【讨论】:

      • 这不起作用。如果任何组件为零,它将只是0 而不是00
      【解决方案6】:

      我认为我有更好的解决方案。

      希望对你有帮助。

      import javafx.scene.paint.Color;
      
      /**
       *
       * @author Marcos Martinewski Alves
       */
      public class ColorUtils {
      
          public static String colorToHex(Color color) {
              return colorChanelToHex(color.getRed())
                      + colorChanelToHex(color.getGreen())
                      + colorChanelToHex(color.getBlue())
                      + colorChanelToHex(color.getOpacity());
          }
      
          private static String colorChanelToHex(double chanelValue) {
              String rtn = Integer.toHexString((int) Math.min(Math.round(chanelValue * 255), 255));
              if (rtn.length() == 1) {
                  rtn = "0" + rtn;
              }
              return rtn;
          }
      
      }
      

      【讨论】:

        【解决方案7】:

        将颜色转换为网页颜色代码:

        public class FxUtils
        {
            public static String toRGBCode( Color color )
            {
                return String.format( "#%02X%02X%02X",
                    (int)( color.getRed() * 255 ),
                    (int)( color.getGreen() * 255 ),
                    (int)( color.getBlue() * 255 ) );
            }
        }
        

        【讨论】:

        • 这里答案中唯一可以正常工作的变体,黑色和其他简单颜色除外。
        • 由于浮点表示,对于许多可能的Color 值,此方法不安全。详情请见this answer
        猜你喜欢
        • 2011-07-12
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        • 2013-06-07
        • 1970-01-01
        • 2017-07-01
        • 1970-01-01
        相关资源
        最近更新 更多