En mi aplicación Java, pude obtener el Color
de a JButton
en términos de rojo, verde y azul; He almacenado estos valores en tres int
s.
¿Cómo convierto esos valores RGB en una que String
contenga la representación hexadecimal equivalente? Como#0033fA
class java.util.IllegalFormatConversionException with message: x != java.lang.Float
String.format("#%06x", color.getRGB() & 0xFFFFFF);
Un trazador de líneas pero sin
String.format
para todos los colores RGB :Color your_color = new Color(128,128,128); String hex = "#"+Integer.toHexString(your_color.getRGB()).substring(2);
Puede agregar una
.toUpperCase()
si desea cambiar a mayúsculas. Tenga en cuenta que esto es válido (como se pregunta en la pregunta) para todos los colores RGB.Cuando tienes colores ARGB puedes usar:
Color your_color = new Color(128,128,128,128); String buf = Integer.toHexString(your_color.getRGB()); String hex = "#"+buf.substring(buf.length()-6);
En teoría, también es posible una línea, pero sería necesario llamar a toHexString dos veces. Evalué la solución ARGB y la comparé con
String.format()
:fuente
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;
fuente
Color.BLUE
, que#0ff
resulta porque & 'ing el valor RGB de Color.BLUE resulta256
en base 10, que estáff
en hexadecimal). Una solución es utilizar unwhile
bucle en lugar de una instrucción if al anteponer ceros.Esta es una versión adaptada de la respuesta dada por Vivien Barousse con la actualización de Vulcan aplicada. En este ejemplo, utilizo controles deslizantes para recuperar dinámicamente los valores RGB de tres controles deslizantes y mostrar ese color en un rectángulo. Luego, en el método toHex () utilizo los valores para crear un color y mostrar el código de color hexadecimal respectivo.
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; } }
Un gran agradecimiento a Vivien y Vulcan. Esta solución funciona perfectamente y fue muy sencilla de implementar.
fuente