You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将基于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的核心绘图组件抽出来,嵌入到全屏窗口中:

  1. 首先在Draw.java中新增两个方法,用来获取绘图组件和原窗口:
// 在Draw.java中添加方法,获取内部的绘图组件(比如Canvas或JPanel,根据实际代码调整变量名)
public Component getDrawingComponent() {
    // 替换成Draw内部实际的绘图组件变量名,比如canvas
    return canvas;
}

// 获取Draw的原窗口,用来隐藏它避免出现双窗口
public JFrame getFrame() {
    // 替换成Draw内部的窗口变量名,比如frame
    return frame;
}
  1. 然后在主程序中组装全屏窗口:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:02:43