W mojej aplikacji Java udało mi się uzyskać wynik Color
a JButton
pod względem koloru czerwonego, zielonego i niebieskiego; Zapisałem te wartości w ciągu trzech int
sekund.
Jak przekonwertować te wartości RGB na plik String
zawierający równoważną reprezentację szesnastkową? Jak na przykład#0033fA
class java.util.IllegalFormatConversionException with message: x != java.lang.Float
String.format("#%06x", color.getRGB() & 0xFFFFFF);
Jedna linijka, ale bez
String.format
dla wszystkich kolorów RGB :Color your_color = new Color(128,128,128); String hex = "#"+Integer.toHexString(your_color.getRGB()).substring(2);
Możesz dodać,
.toUpperCase()
jeśli chcesz przełączyć się na wielkie litery. Zwróć uwagę, że jest to ważne (zgodnie z pytaniem) dla wszystkich kolorów RGB.Jeśli masz kolory ARGB , możesz użyć:
Color your_color = new Color(128,128,128,128); String buf = Integer.toHexString(your_color.getRGB()); String hex = "#"+buf.substring(buf.length()-6);
Jedna linijka jest teoretycznie również możliwa, ale wymagałaby dwukrotnego wywołania toHexString. Testowałem rozwiązanie ARGB i porównałem z
String.format()
:źródło
Random ra = new Random(); int r, g, b; r=ra.nextInt(255); g=ra.nextInt(255); b=ra.nextInt(255); Color color = new Color(r,g,b); String hex = Integer.toHexString(color.getRGB() & 0xffffff); if (hex.length() < 6) { hex = "0" + hex; } hex = "#" + hex;
źródło
Color.BLUE
wyjście,#0ff
ponieważ wartość RGB koloru NIEBIESKIEGO daje256
podstawę 10, która jest zapisana w systemieff
szesnastkowym). Rozwiązaniem jest użyciewhile
pętli zamiast instrukcji if podczas poprzedzania zer.To jest dostosowana wersja odpowiedzi udzielonej przez Vivien Barousse z zastosowaną aktualizacją z Vulcan . W tym przykładzie używam suwaków, aby dynamicznie pobierać wartości RGB z trzech suwaków i wyświetlać ten kolor w prostokącie. Następnie w metodzie toHex () używam wartości do tworzenia koloru i wyświetlania odpowiedniego kodu szesnastkowego koloru.
public class HexColor { public static void main (String[] args) { JSlider sRed = new JSlider(0,255,1); JSlider sGreen = new JSlider(0,255,1); JSlider sBlue = new JSlider(0,255,1); JLabel hexCode = new JLabel(); JPanel myPanel = new JPanel(); GridBagLayout layout = new GridBagLayout(); JFrame frame = new JFrame(); //set frame to organize components using GridBagLayout frame.setLayout(layout); //create gray filled rectangle myPanel.paintComponent(); myPanel.setBackground(Color.GRAY); //In practice this code is replicated and applied to sGreen and sBlue. //For the sake of brevity I only show sRed in this post. sRed.addChangeListener( new ChangeListener() { @Override public void stateChanged(ChangeEvent e){ myPanel.setBackground(changeColor()); myPanel.repaint(); hexCode.setText(toHex()); } } ); //add each component to JFrame frame.add(myPanel); frame.add(sRed); frame.add(sGreen); frame.add(sBlue); frame.add(hexCode); } //end of main //creates JPanel filled rectangle protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawRect(360, 300, 10, 10); g.fillRect(360, 300, 10, 10); } //changes the display color in JPanel private Color changeColor() { int r = sRed.getValue(); int b = sBlue.getValue(); int g = sGreen.getValue(); Color c; return c = new Color(r,g,b); } //Displays hex representation of displayed color private String toHex() { Integer r = sRed.getValue(); Integer g = sGreen.getValue(); Integer b = sBlue.getValue(); Color hC; hC = new Color(r,g,b); String hex = Integer.toHexString(hC.getRGB() & 0xffffff); while(hex.length() < 6){ hex = "0" + hex; } hex = "Hex Code: #" + hex; return hex; } }
Ogromne podziękowania dla Vivien i Vulcan. To rozwiązanie działa doskonale i było super proste do wdrożenia.
źródło