使用drawString()java时会跳过Color.White

时间:2014-12-28 14:32:46

标签: java swing graphics colors background-color

当我试图在黑色背景上画白色字母时,我注意到一些奇怪的东西。

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
}

!不要看图像中的代码,只需看一下框架!

给我这个: "White" letters on a black background

然而,线条画得很好。

"White" letters and a white line on a black background

当我拍摄不同但非常接近的颜色(254,255,255)时,我得到了这个

White letters on a black background

为什么java.awt.Graphics阻止绘制纯白色(255,255,255)字母(即使它是在黑色背景上)?

Tia,查理

3 个答案:

答案 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。如果没有它,它就不可见了。