【问题标题】:Color.White is getting skipped when using drawString() java使用 drawString() java 时 Color.White 被跳过
【发布时间】:2015-02-24 23:00:27
【问题描述】:

当我尝试在黑色背景上绘制白色字母时,我发现了一些奇怪的东西。

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) 字母(即使它位于黑色背景上)?

蒂亚,查理

【问题讨论】:

  • 呼叫setVisible(true) LAST,添加所有组件并设置好之后。不要覆盖paint,而是要覆盖paintComponent。最后,永远不要将代码显示为图像。你的 GUI,当然,但从不编码。我们现在如何复制、粘贴和测试您的代码?
  • @HovercraftFullOfEels 根据您的建议编辑代码。屏幕截图恰好在后台使用 Eclipse。为问题添加了完整代码。
  • @HovercraftFullOfEels 查看我的代码,frame.setVisible(true) 是最后调用的。不要介意图像中的代码,结果保持不变._.
  • 从 255,255,255 得到的颜色与 0,0,0:BLACK 相同。我不知道为什么会这样,也没有找到解释或任何暗示这应该是一个错误。此外, setColor( 0xFFFFFF ) 或使用 1.0F,1.0F,1.0F 具有相同的效果。您可以将 alpha 设置为稍微偏离最大值(254 或 0.999),它会显示为白色,但不是 1.0F/255 alpha。

标签: java swing graphics colors background-color


【解决方案1】:

在添加所有组件并进行设置后,最后调用 setVisible(true)。不要覆盖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();
         }
      });
   }
}

【讨论】:

  • 执行了你的代码,但是来自.drawString()的字符串仍然没有显示颜色(255,255,255)
  • @Charlie:那我恐怕无法解释可能出了什么问题
【解决方案2】:

您正在向框架添加面板。 setVisible(true) 到 JFrame。没有它,它将不可见。

【讨论】:

  • 嗯,我做了frame.setVisible(true),对吧?线条绘制正确。为什么没有字符串呢?
【解决方案3】:

jdk1.8.0_20 中的一个错误,至少在 Linux (Ubuntu) 中:0xFFFFFFFF 显示为黑色。更改 alpha 或其中一个 RGB 值会导致“几乎是白色”。

jdk1.7.0_67 在同一系统上运行良好。

检查了所有形式的 setColor。

后来发现报错:JDK-8054638 : White color is not painted

受影响的版本:8u11,8u25

此错误仅影响 Linux;在 Windows 上一切正常。

【讨论】:

  • 使用“jdk1.8.0_25”时也是这样。是否已向 Oracle 报告?
  • 这里是错误报告:bugs.openjdk.java.net/browse/JDK-8054638。该bug待在jdk1.8.0_40中修复,尚未发布。
  • 线条画得很完美是不是很奇怪?
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2021-06-05
  • 2014-03-14
  • 2013-03-04
  • 1970-01-01
相关资源
最近更新 更多