ในแอปพลิเคชัน Java ของฉันฉันได้รับColor
a JButton
ในรูปแบบของสีแดงสีเขียวและสีน้ำเงิน ฉันเก็บค่าเหล่านี้ไว้เป็นสามint
วินาที
ฉันจะแปลงค่า RGB เหล่านั้นให้เป็นค่าString
แทนเลขฐานสิบหกที่เทียบเท่าได้อย่างไร เช่น#0033fA
ในแอปพลิเคชัน Java ของฉันฉันได้รับColor
a JButton
ในรูปแบบของสีแดงสีเขียวและสีน้ำเงิน ฉันเก็บค่าเหล่านี้ไว้เป็นสามint
วินาที
ฉันจะแปลงค่า RGB เหล่านั้นให้เป็นค่าString
แทนเลขฐานสิบหกที่เทียบเท่าได้อย่างไร เช่น#0033fA
คำตอบ:
คุณสามารถใช้ได้
String hex = String.format("#%02x%02x%02x", r, g, b);
ใช้ตัวพิมพ์ใหญ่ X หากคุณต้องการให้เลขฐานสิบหกที่เป็นผลลัพธ์เป็นตัวพิมพ์ใหญ่ ( #FFFFFF
เทียบกับ#ffffff
)
class java.util.IllegalFormatConversionException with message: x != java.lang.Float
String.format("#%06x", color.getRGB() & 0xFFFFFF);
ซับเดียว แต่ไม่มีString.format
สำหรับสีRGBทั้งหมด:
Color your_color = new Color(128,128,128);
String hex = "#"+Integer.toHexString(your_color.getRGB()).substring(2);
คุณสามารถเพิ่ม.toUpperCase()
ถ้าคุณต้องการเปลี่ยนเป็นตัวพิมพ์ใหญ่ โปรดทราบว่าสิ่งนี้ใช้ได้ (ตามที่ถามในคำถาม) สำหรับสี RGB ทั้งหมด
เมื่อคุณมีสีARGBคุณสามารถใช้:
Color your_color = new Color(128,128,128,128);
String buf = Integer.toHexString(your_color.getRGB());
String hex = "#"+buf.substring(buf.length()-6);
ซับหนึ่งเส้นก็เป็นไปได้ในทางทฤษฎีเช่นกัน แต่จะต้องเรียก toHexString สองครั้ง ฉันเปรียบเทียบโซลูชัน ARGB และเปรียบเทียบกับString.format()
:
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;
Color.BLUE
ซึ่งเป็นผลลัพธ์#0ff
เนื่องจาก & 'ในค่า RGB ของ Color.BLUE ให้ผลลัพธ์256
ในฐาน 10 ซึ่งเป็นเลขฐานff
สิบหก) การแก้ไขคือการใช้while
ลูปแทนคำสั่ง if เมื่อเติมค่าศูนย์ล่วงหน้า
นี้เป็นรุ่นที่ดัดแปลงมาของคำตอบที่ได้รับจากวิเวียน Barousseกับการปรับปรุงจากวัลแคนนำมาใช้ ในตัวอย่างนี้ฉันใช้แถบเลื่อนเพื่อดึงค่า RGB แบบไดนามิกจากแถบเลื่อนสามตัวและแสดงสีนั้นในรูปสี่เหลี่ยมผืนผ้า จากนั้นในวิธี toHex () ฉันใช้ค่าเพื่อสร้างสีและแสดงรหัสสี Hex ตามลำดับ
ตัวอย่างนี้ไม่มีข้อ จำกัด ที่เหมาะสมสำหรับ GridBagLayout แม้ว่ารหัสจะใช้งานได้ แต่การแสดงผลจะดูแปลก ๆ
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;
}
}
ขอบคุณมากทั้งวิเวียนและวัลแคน โซลูชันนี้ทำงานได้อย่างสมบูรณ์แบบและใช้งานง่ายสุด ๆ