3

简单地说,我正在尝试制作一款全屏游戏。

我尝试使用以下代码:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
if(!gs.isFullScreenSupported()) {
    System.out.println("full-screen not supported");
}

Frame frame = new Frame(gs.getDefaultConfiguration());
Window win = new Window(frame);

try {
    // Enter full-screen mode
    gs.setFullScreenWindow(win);
    win.validate();
}

问题是我在一个扩展 JPanel 的类中工作,虽然我有一个 Frame 类型的变量,但我在类中没有 Window 类型。

我对 JPanel 的理解是它是一个窗口,但我不能将“this”传递给 gs.setFullScreenWindow(Window win)... 我应该如何做呢?

有没有使用 JPanel 调用它的简单方法或类似方法?

有没有办法从我的 JPanel 中获取 Window 类型的东西?

-

编辑:以下方法更改 JFrame 的状态并每 10 毫秒调用一次:

public void paintScreen()
{
    Graphics g;
    try{
        g = this.getGraphics(); //get Panel's graphic context
        if(g == null)
        {
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setExtendedState(frame.getExtendedState()|JFrame.MAXIMIZED_BOTH);
            frame.add(this);
            frame.pack();
            frame.setResizable(false);
            frame.setTitle("Game Window");
            frame.setVisible(true);
        }
        if((g != null) && (dbImage != null))
        {
            g.drawImage(dbImage, 0, 0, null);
        }
        Toolkit.getDefaultToolkit().sync(); //sync the display on some systems
        g.dispose();
    }
    catch (Exception e)
    {
        if(blockError)
        {
            blockError = false;
        }
        else
        {
            System.out.println("Graphics context error: " + e);
        }
    }
}

我预计在 if(g==null) 语句(所有 frame.somethingOrOther()s)之后可能会有一些冗余或不必要的调用,任何清理建议将不胜感激......

此外,块错误就是它看起来的样子。我忽略了一个错误。错误只发生一次,当设置忽略错误的第一个实例时,这可以正常工作...对于任何感兴趣的人,如果有人想查看是否可以删除该块,我可以在那里发布其他信息,但我不担心...我以后可能会调查它。

4

4 回答 4

2

你在这个问题上有什么进展吗?如果您可以用您的预期行为和代码实际在做什么来更新您的问题,这可能会有所帮助?正如已经指出的,JFrame 是 Window 的子类,因此如果您有 JFrame,则不需要 Window。

对于它的价值,我有一个在全屏模式下工作的 Java 应用程序。尽管屏幕没有像您的那样经常重新粉刷,但它会定期重新粉刷。我执行以下操作以进入全屏:

// pseudo-code; not compilable

JPanel container = new JPanel();
container.setOpaque( true ); // make sure the container will be visible

JFrame frame = new JFrame();
frame.getContentPane().add(container); // add the container to the frame
frame. ... //other initialization stuff, like default close operation, maximize, etc

if ( fullScreenModeIsSupported )
    frame.setUndecorated( true ); // remove window decorations from the frame
    gs.setFullScreenWindow( frame );
    frame.validate();

然后每当我需要更新屏幕时,我只需将一个新的 JPanel 插入containerJPanel:

// pseudo-code; not compilable

container.removeAll(); // clean out the container
container.add( jPanelWithNewDisplay ); // add the new display components to the container
container.validate();  // update and redisplay
container.repaint();

不能说它在技术上是完美的,但对我来说效果很好。如果伪代码示例不能解决问题,我可以花一些时间整理一个可编译的示例。

于 2009-11-13T16:17:27.383 回答
0

JPanel不是Window的子类。JFrame是。

所以你可以尝试:

JFrame yourFrame = new JFrame();
yourFrame.add(yourPanel);

appyYourFullScreenCodeFor( yourFrame );

那应该行得通。

于 2009-11-05T03:09:28.580 回答
0

我想我得到了你需要的东西。

  1. 将框架设置为未装饰,因此它没有任何标题栏和东西。

  2. 将您的面板添加到框架中。所以看起来只显示了您的面板。

  3. 最大化你的框架。所以现在看起来应该只有你的面板在没有和窗口的情况下全屏显示。

    frame.setUndecorated(true); 框架。添加(面板);//现在最大化你的框架。

注意:重要的是要注意,未修饰的 API 只能在您的框架不可显示时调用,因此如果它已经显示,那么首先您需要执行 setVisible(false)。

EDIT1:如果您只想获取包含面板的窗口,那么您可以这样做:

Window win = SwingUtilities.getAncestorOfClass(Window.class, myPanel);

获得窗口实例后,您可以将其传递到任何您想要的地方。

EDIT2Frame类也扩展Window ,所以你可以直接做gs.setFullScreen(frame)。您不需要为该框架创建一个新窗口。

于 2009-11-05T04:25:22.667 回答
-1

我对 JPanel 的理解是它是一个窗口

你为什么那么想?你读过 API 吗?JPanel 是否从 Window 扩展而来?

您可以尝试使用 SwingUtilities 类。它有一个返回给定组件的 Window 的方法。

于 2009-11-05T02:59:01.610 回答