当我试图在黑色背景上画白色字母时,我注意到一些奇怪的东西。
public WhiteOnBlackPanel() {
setBackground(Color.BLACK);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(new Color(255,255,255));
g.drawString("Hello World",100,100);
g.drawLine(0,0,100,100);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.add(new WhiteOnBlackPanel());
frame.setTitle("Hello World");
frame.setSize(600,400);
frame.setLocation(100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); // The frame is visible from now on
}
!不要看图像中的代码,只需看一下框架!
给我这个:
然而,线条画得很好。
当我拍摄不同但非常接近的颜色(254,255,255)时,我得到了这个
为什么java.awt.Graphics
阻止绘制纯白色(255,255,255)字母(即使它是在黑色背景上)?
答案 0 :(得分:4)
jdk1.8.0_20中的错误,至少在Linux(Ubuntu)中:0xFFFFFFFF显示为BLACK。更改alpha或其中一个RGB值会导致"几乎为白色"。
jdk1.7.0_67在同一系统上运行良好。
检查所有形式的setColor。
稍后发现错误已报告:JDK-8054638 : White color is not painted
受影响的版本:8u11,8u25
此错误仅影响Linux;在Windows上,一切正常。
答案 1 :(得分:2)
调用setVisible(true)LAST,添加所有组件并进行设置。不要覆盖paint,而是覆盖paintComponent。例如,这很好用:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;
@SuppressWarnings("serial")
public class ShowColor extends JPanel {
private static final int PREF_W = 600;
private static final int PREF_H = 400;
public ShowColor() {
setBackground(Color.black);
}
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(new Color(255,255,255));
g.drawString("Hello World",100,100);
}
private static void createAndShowGUI() {
ShowColor paintEg = new ShowColor();
JFrame frame = new JFrame("ShowColor");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(paintEg);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答案 2 :(得分:-1)
您正在向框架添加面板。 setVisible(true)到JFrame。如果没有它,它就不可见了。