2013-07-29 27 views
5

JavaFX ColorPickerでColorを選択しました。今私は16進文字列としてそれを保存する必要があります。 thisメソッドが見つかりましたが、JavaFXの場合は適用されません。 JavaFXにはgetRGB()メソッドを持たない独自のColorクラスがあり、メディエーション型変換として使用できます。JavaFX ColorPickerカラーから16進数文字列を取得するには?

答えて

4

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

これはアイデア、完全なコード(コピーpastable)であります

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

これは簡単で、うまくいきます。 – Marc

+3

これは脆弱な解決策です。ハッシュコードの生成は実装依存であるため、それ以降のリリースでは確実に機能しません。 (たとえば、opacyなどのハッシュコードに別のフィールドが含まれている場合) – Balage1551

+1

良い仕事です。これは助けてください –

2

getGreen()getBlue()getRed()のメソッドを使用して、16進数に変換できます。その後、赤と青のための

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

繰り返し、これを:これはトリックはありません

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'ではなく '0'になります。 –

28

色をウェブのカラーコード:

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

ここでの回答のうち、黒やその他の単純な色の例外はありません。 – Dragon

0

私はより良い解決策があると思います。

希望します。

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

} 
2

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

の現在受け入れられて答えたものの中で最も作業の答えは、現在利用可能では(参考のために以下)ゾンのある

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

この方法が問題に実行されますが最初のゼロの自動削除。色の16進数の値が0(例えば#000000、#00A3FFなど)で始まる場合、開始ゼロは自動的に削除され、文字列が短すぎると16進コードとして完全に機能しません。 Color.BLACKは、不透明度のみを維持するため、16進数「#FF」を生成します。以下のメソッドは、JavaFX 8u112の時点で、カラーから16進への変換を完全に解決します。

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

これは私が通過したトラブルを誰かに救うことを望みます!

+0

キャストの優先順位が高いため、最初のソリューションではすべてのJavaバージョンでゼロのみが生成されるため、基本的には常に「0 * 255」 – Midnightas

関連する問題