2012-12-15 45 views
0

我正在开发一个在嵌入式系统中使用Java的项目。我有用于屏幕和触摸输入的驱动程序,以及用于文本输入的虚拟键盘。我的屏幕驱动程序有一个Graphics2D对象可以绘制到repaint(Rectangle)更新方法。同样,触摸驱动程序能够为听众生成MouseEvents为定制驱动程序创建GraphicsDevice

现在我正在使用直接绘制到屏幕上。这很好,但我真正想要的是允许我的库的用户创建JFrame并使用普通的Swing元素。但是,默认的GraphicsEnvironment是无头的,因为Java没有看到我的EInkDriver类或我的TouchDriver类。

我知道有办法调用组件的paint方法来获取图像;但是,当您绘制Container时,这存在问题,并且我还想向用户展示GraphicsConfiguration,以便他们可以编写类似JFrame frame = new JFrame(getEInkGraphicsConfiguration());的东西,并继续进行,就像编写桌面Swing应用程序一样。

鉴于我已拥有这些功能,我将如何创建GraphicsDeviceGraphicsEnvironment,这将允许我在我的项目中使用Swing?

回答

1

我对抽象类GraphicsEnvironment进行了很简短的介绍,并猜测,可能会派生自己的类,并使用第64行的“java.awt.graphicsenv”键进行注册。

幸运的是有一个抽象类,代码很少。


此后

从GraphicsEnvironment中下面的代码显示:

  1. 系统属性(您可能设置),其用于无头与否。
  2. 环境设置DISPLAY。

也许您可以使用此信息。

     String osName = System.getProperty("os.name"); 
         if (osName.contains("OS X") && "sun.awt.HToolkit".equals(
           System.getProperty("awt.toolkit"))) 
         { 
          headless = defaultHeadless = Boolean.TRUE; 
         } else { 
          headless = defaultHeadless = 
           Boolean.valueOf(("Linux".equals(osName) || 
               "SunOS".equals(osName) || 
               "FreeBSD".equals(osName) || 
               "NetBSD".equals(osName) || 
               "OpenBSD".equals(osName)) && 
               (System.getenv("DISPLAY") == null)); 
         } 
+0

感谢您的快速反应,但我更关心“派生自己的班级”的细节。如果我可以派生类,那么我可以通过调用'JFrame(GraphicsConfiguration)'来使用它。然而,我坚持如何实际派生该类。我正在考虑覆盖'GraphicsDevice.getFullScreenWindow()',但是如果没有'GraphicsEnvironment',我就无法创建'Window',这让我产生了一个鸡蛋和鸡蛋的问题。 –

+0

我没有真正看过它,没有保证,但我想到了设置'java.awt.graphicsenv = my.packge.MyGraphicsEnvironmentChild'。 –

+0

我明白那部分......它并没有解释如何实际实现'my.packge.MyGraphicsEnvironmentChild'。如果我可以实现该类,那么我不需要设置该属性,因为我可以调用'JFrame(new MyGraphicsEnvironmentChild())'。你的答案假定我可以实现这个课程,但我不能这么做 - 这就是我的问题所要求的。所以不幸的是你的回答没有帮助。 –