Java graphics.drawString使用AWT

时间:2015-08-29 19:19:57

标签: java awt drawstring

我编写了一个很好的小实用程序,一切顺利,但后来我尝试添加一些标签。他们出现了。然后我把它们做得更长,然后就消失了。我尝试了很多实验(重新定位,更改字体,更改顺序),但除了较长的字符串有问题之外,没有什么是一致的。认为我错误地使用Swing,我试图通过回到AWT来简化,但我看到几乎相同的问题。我甚至使用jdb逐步完成代码,有时候g.drawString可以处理较长的字符串,有时则不会。我尝试捕捉任何错误,也没有看到任何错误。

显然,我遗漏了一些基本的东西。有人能解释一下: 1)为什么较短的字符串(例如"标签")似乎始终有效? 2)为什么较长的琴弦有时根本不显示? 3)是由于根本没有被渲染还是被其他图像覆盖而导致的失败? 4)如果#3被覆盖",如何控制这些其他(未知)图像的顺序?

我已经删除了代码。我正在使用javac 1.7.0_79进行编译

import java.awt.*;

public class GraphicsQuestion extends Frame {
   public GraphicsQuestion()
   {
       super("Question");  //call to Frame
       setFocusable(true);
   }
   public void DrawLabels(Graphics g)
   {
       g.setFont(new Font("Courier", Font.PLAIN, 16));
       g.setColor(Color.BLACK);

       g.drawString("label", 0, 100);
       String ss = new String("label1234567890123456789");
       g.drawString(ss, 100, 150);

       g.drawString("label12345", 100, 170); //does not print
       g.drawString("label1", 10, 170);

   }
   public void paint(Graphics g)
   {
      super.paint(g);
      DrawLabels(g);
   }
   public static void main(String args[]) {
      GraphicsQuestion gq = new GraphicsQuestion();
      gq.setBackground(Color.WHITE);
      gq.setSize(800, 200);
      gq.setVisible(true);
   }
}

正如代码中的注释所示,输出缺少其中一个标签。有时,它缺少两个较长的标签。如果我注释掉" label12345"的印刷,我第一次执行时,我错过了"标签1234567890123456789"标签。如果我制作" label12345"字符串更短,如" label123" 打印所有内容

我习惯于编程中的一致行为。如果我无法理解这个简单示例的内容,我对构建更复杂的东西犹豫不决。任何人都可以解释不一致的行为吗?

****上面的原始问题,以下是基于收到的答案****

感谢VGR的快速回复。我一直试图不把Swing和AWT混合在一起#34;但我尝试了代码。它似乎改善了一些事情。不幸的是,我把它带到了一个新的水平,并添加了KeyListener功能,我再次看到了不稳定性。

现在我想知道我是否有比Java错误更深的东西。也许我有一些硬件或图形驱动程序失败,因为字体可能会失真。我可以编译代码,它会在20次中丢失标签20次,然后以相同的方式重新编译相同的代码并获得这种扭曲的输出。

http://www.screencast.com/t/rsBjRZlXlWu

我将在下面包含我的新代码,但这看起来越来越像Java编程问题,更像是一个环境问题。我正在戴尔E7450上运行Ubuntu 14.04.3 LTS

import java.awt.*;
import java.awt.event.*;
import javax.swing.SwingUtilities;

class GraphicsAnswer extends Frame implements KeyListener {
   public GraphicsAnswer()
   {
       super("Question2");  //call to Frame
       addKeyListener(this);
       setFocusable(true);
   }
   public void DrawLabels(Graphics g)
   {
       g.setFont(new Font("Courier", Font.PLAIN, 16));
       g.setColor(Color.BLACK);

       g.drawString("label", 0, 100);
       String ss = new String("label1234567890123456789");
       g.drawString(ss, 100, 150);            //sometimes distorted

       g.drawString("label123456", 100, 170); //sometimes distorted
       g.drawString("label1", 10, 170);

   }
   public void paint(Graphics g)
   {
      super.paint(g);
      DrawLabels(g);
   }
   public void keyPressed(KeyEvent e)
   {
      int keyCode = e.getKeyCode();
      if (e.getKeyChar() == 'X')
         System.exit(0);
      else
         update(e.getKeyChar());
   }
   public void keyReleased(KeyEvent e)
   {
   }
   public void keyTyped(KeyEvent e)
   {
   }
   public void update( char c)
   {
      Graphics g = this.getGraphics();
      g.drawString("done", 10, 10);
   }
}

public class QMain2 implements Runnable {
    public void run() {
       // Invoked on the event dispatching thread
       // Construct and show GUI
       GraphicsAnswer ga = new GraphicsAnswer();
       ga.setBackground(Color.WHITE);
       ga.setSize(800, 200);
       ga.setVisible(true);
    }
    public static void main(String [] args) {
       SwingUtilities.invokeLater(new QMain2());
    }
}

任何人都知道Java的字体驱动程序测试套件,所以我可以测试我的环境吗?

1 个答案:

答案 0 :(得分:0)

我已经输入,测试并编译了上面的确切代码而没有进行任何修改,所有内容似乎都没有出现任何缺陷。所有四个字符串都显示了我在其上进行的20/20测试运行。

你提到你被剥夺了#34;你发布的这个问题的代码,所以问题可能在于项目的其余部分,或者只是你最终的图形错误。

以下是我在所有20个测试编译中的screenshot结果。祝你好运!