在Java中没有JPanel的情况下绘图

5
我正在编写一个图形用户界面,用于在xy轴上绘制数据。它是使用Java Swing编写的,因此我有一个包含整个GUI的JFrame。GUI的组件之一是JPanel,它构成了绘制数据的区域。我使用Graphics2D进行绘图。
我正在尝试将此程序扩展为命令行扩展程序。这个想法是允许用户在配置文件中指定要绘制的数据。这允许进行有趣的参数扫描,可以节省大量时间。
问题出现在我尝试获取Graphics对象以进行绘图时。我创建了执行绘图的JPanel,但当我调用paintComponent()时,Graphics对象为空。
此外,当您再次从命令行运行程序时,它会从您正在尝试做其他事情的任何内容(如果该程序在后台运行)中夺取焦点。有没有办法避免这种情况?必须创建JPanel来进行绘图吗?
感谢提供的任何帮助!
P.S.当我说我正在从命令行运行程序时,我的意思是说您没有使用GUI。所有绘图等都是在没有界面的情况下完成的。此外,我知道你不能实例化一个Graphics对象。

当您从命令行运行时,您想在哪里绘制?您是否尝试将终端/控制台/命令提示符用作绘图画布?或者您的意思是程序在没有GUI的情况下启动,并需要创建一个JFrame来绘制? - MikeD
有趣。你必须从某个地方创建图形。可以使用打印机API创建Graphics实例,可能你可以在那个路径中查找。我会尝试配置一种“文件打印机”,然后获取该打印作业。可能那会给你一个Graphics对象。请参阅http://java.sun.com/javase/6/docs/api/java/awt/PrintJob.html。 - OscarRyz
@MikeD - 最终我想将图形保存为JPEG格式。我并不是特别关心我正在绘制什么。使用绘制JPanel的相同代码会很不错。 - Ryan
2个回答

6

使用java.awt.image.BufferedImage

BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();

//.. draw stuff ..

ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
writer.setOutput(ImageIO.createImageOutputStream(new File("myimage.png"));
writer.write(image);

3

如果您不使用GUI,则需要使用无头模式,这将为您提供适当的图形环境。您将必须使用选项执行,例如:

java -Djava.awt.headless=true 

或者在您的主类中设置属性,例如:

System.setProperty("java.awt.headless", "true");

请查看链接以获取更多编程示例。


谢谢!这有助于解决失去焦点的问题。我希望我能接受这两个答案。 - Ryan
@Ryan - 很好知道;只是顺便提一下,如果你计划在Unix环境中使用你的软件,你需要安装一个叫做“虚拟帧缓冲器”的东西并启动它的服务,这样无头模式才能与X11正常工作。 - ring bearer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接