JPanels,JFrames和Windows,哦,我的!

时间:2009-11-05 02:52:56

标签: java window jframe fullscreen jpanel

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

我正在尝试使用以下代码:

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的状态,每10ms调用一次:

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 个答案:

答案 0 :(得分: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插入container JPanel:

// 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();

不能声称它在技术上是完美的,但对我来说效果很好。如果伪代码示例没有削减它,我可以花一些时间整理一个可编译的例子。

答案 1 :(得分:0)

JPanel不是Window的子类。 JFrame是。

所以你可以试试:

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

appyYourFullScreenCodeFor( yourFrame );

这应该有效。

答案 2 :(得分:0)

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

  1. 设置框架未修饰,所以它     没有任何标题栏和     东西。

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

  3. 最大化您的框架。所以现在呢 应该看起来只有你的 面板全屏没有 和窗口的东西。

      

    frame.setUndecorated(真);   frame.add(面板); //现在最大化你的   帧。

  4. 注意:重要的是要注意,只有在您的帧无法显示时才能调用未修饰的API,因此如果它已经显示,那么首先需要执行setVisible(false)。

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

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

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

    EDIT2 Frame类也扩展了Window,因此您可以直接gs.setFullScreen(frame)。你不需要为那个框架创建一个新窗口。

答案 3 :(得分:-1)

  

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

为什么你会这么想?你读过API了吗? JPanel是否从Window扩展?

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