如何将基于Princeton库Draw类的Java绘图程序改为全屏运行?
解决Princeton Draw类全屏显示的问题
我理解你遇到的困扰——想用Full-Screen Exclusive Mode实现Draw窗口全屏,但总是出现两个独立窗口,还不想大幅改动现有使用Draw的代码。下面是两种可行的解决方案,核心思路是复用Draw的现有窗口/绘图组件,避免新建独立的全屏窗口:
方案一:直接将Draw的窗口设为全屏(推荐,改动最小)
如果你已经在Draw.java中实现了getFrame()方法来获取它的内部窗口,这个方案最直接:
// 初始化Draw实例,和你原来的代码完全一致 Draw draw = new Draw("TapReact"); int canvasWidth = 1350; int canvasHeight = 800; draw.setCanvasSize(canvasWidth, canvasHeight); // 获取本地全屏设备 GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice graphicsDevice = graphicsEnvironment.getDefaultScreenDevice(); // 获取Draw的内部窗口 JFrame drawFrame = draw.getFrame(); // 先隐藏窗口再设置全屏,避免画面闪烁 drawFrame.setVisible(false); // 直接将Draw的窗口设为全屏窗口 graphicsDevice.setFullScreenWindow(drawFrame); // 重新显示全屏窗口 drawFrame.setVisible(true); // 可选:添加ESC键退出全屏的监听 drawFrame.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { graphicsDevice.setFullScreenWindow(null); drawFrame.dispose(); System.exit(0); } } }); drawFrame.setFocusable(true); drawFrame.requestFocus();
这个方案的关键是不要新建额外的Window,直接把Draw自带的窗口交给setFullScreenWindow(),这样Draw的所有绘图内容都会直接渲染在全屏窗口里,完全保留你原来使用Draw的代码逻辑。
方案二:将Draw的绘图组件嵌入全屏窗口(适合无法修改Draw窗口的情况)
如果Draw的内部窗口无法直接复用(比如它的初始化逻辑绑定了固定窗口属性),你可以把Draw的核心绘图组件抽出来,嵌入到全屏窗口中:
- 首先在Draw.java中新增两个方法,用来获取绘图组件和原窗口:
// 在Draw.java中添加方法,获取内部的绘图组件(比如Canvas或JPanel,根据实际代码调整变量名) public Component getDrawingComponent() { // 替换成Draw内部实际的绘图组件变量名,比如canvas return canvas; } // 获取Draw的原窗口,用来隐藏它避免出现双窗口 public JFrame getFrame() { // 替换成Draw内部的窗口变量名,比如frame return frame; }
- 然后在主程序中组装全屏窗口:
Draw draw = new Draw("TapReact"); int canvasWidth = 1350; int canvasHeight = 800; draw.setCanvasSize(canvasWidth, canvasHeight); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); // 创建全屏窗口的所有者Frame,以及全屏Window Frame fullScreenOwner = new Frame(); Window fullScreenWindow = new Window(fullScreenOwner); // 设置布局让绘图组件占满全屏 fullScreenWindow.setLayout(new BorderLayout()); // 将Draw的绘图组件添加到全屏窗口中 fullScreenWindow.add(draw.getDrawingComponent(), BorderLayout.CENTER); // 隐藏Draw原来的窗口,避免出现双窗口 draw.getFrame().setVisible(false); // 设置并显示全屏窗口 gd.setFullScreenWindow(fullScreenWindow); fullScreenWindow.setVisible(true); // 添加ESC键退出监听 fullScreenWindow.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { graphicsDevice.setFullScreenWindow(null); fullScreenWindow.dispose(); draw.getFrame().dispose(); System.exit(0); } } }); fullScreenWindow.setFocusable(true); fullScreenWindow.requestFocus();
为什么之前的方法失败?
你之前新建了一个独立的Window,但Draw自己的窗口仍然在显示,所以会出现两个窗口。核心问题是没有让Draw的内容和全屏窗口建立关联——要么让Draw使用全屏窗口作为它的容器,要么把Draw的内容移到全屏窗口里,而不是同时保留两个独立窗口。
内容的提问来源于stack exchange,提问作者Brixzz
相关产品推荐
相关产品推荐

