图形包没有正确格式化文本

时间:2013-09-15 20:24:24

标签: java string graphics formatting

我有一些在开头执行某些功能的类,它们写入csis.txt。之后我会弹出一个窗口来显示csis.txt中的内容。然而,它没有正确形成。这就是我所拥有的:

import java.io.*;
import java.awt.*;
import java.util.Scanner;

public class Driver extends Canvas {


public Driver(){
    setSize(200, 200);
    setBackground(Color.white);
}

public static void main(String[] args) throws IOException {
    PrintWriter pw = new PrintWriter(new FileWriter("csis.txt"));
    MFQ mfq = new MFQ(pw);
    mfq.getJobs();
    mfq.outputHeader();
    mfq.runSimulation();
    mfq.outStats();
    pw.close();
    Driver GP = new Driver();


    Frame aFrame = new Frame();
    aFrame.setSize(1000, 1000);


    aFrame.add(GP);

    aFrame.setVisible(true);
}

public void paint(Graphics g) {
    try {
        Scanner fileScan = new Scanner(new File("csis.txt"));
        String s = fileScan.nextLine();
        for (int i = 20; fileScan.hasNext(); i += 20) {
            g.drawString(fileScan.nextLine(), 0, i);
        }
    }
    catch (IOException e) {
        System.err.println("Caught IOException: " + e.getMessage());
    }
}

}

csis.txt:

http://pastebin.com/Ynh6jqYk

csis.txt和图形窗口的正面未正确格式化:

side by side

2 个答案:

答案 0 :(得分:1)

您必须设置等宽字体才能实现此目的。尝试在for方法的paint循环之前添加这些行:

Font f = this.getFont();
g.setFont(new Font("monospaced", f.getStyle(),f.getSize()));

希望这有帮助,它对我有用。


正如MadProgrammer所说,你不应该覆盖JFrame#paint方法。请改用JPanel并覆盖其paintComponent方法以执行自定义绘制。

答案 1 :(得分:0)

  1. 避免使用paint等顶级组件中的JFrame。这些涂料的要求通常比普通成分更复杂,并且它们不是双缓冲的
  2. 您必须致电super.paintXxx以确保您遵守复杂的油漆链
  3. 尽量避免在任何paintXxx方法中加载资源,这些资源应尽可能快地返回,以免降低绘制过程的速度。
  4. 输出是使用可变宽度字体的问题。意味着每个角色都有自己的宽度。相反,您需要尝试使用固定宽度的字体。
  5. 查看Performing Custom Painting了解详情

    看看

    对于某些字体建议......

    您可以将文字加载到GraphicsJTextArea,而不是直接使用JTextPane绘图。

    请查看How to use text compnents了解详情

    我也很想解析输入并将其加载到JTabe

    有关详细信息,请参阅how to use tables