0

我正在尝试将 jinternal 框架添加到处于全屏独占模式的框架中。但是,当我添加它时,它会用白色填充整个屏幕。这是我的代码。

    JFrame f = new JFrame();
    f.setTitle("Platform Game"); 
    f.setLocationRelativeTo(null); 
    f.setUndecorated(true);
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gs = ge.getDefaultScreenDevice();
    gs.setFullScreenWindow(f);
    f.setVisible(true);
    createFrame(f);


protected static void createFrame(JFrame f)
{
    JInternalFrame frame = new JInternalFrame("Options", false, true, false, false);
    frame.setVisible(true);
    frame.setSize(10, 10);
    frame.setLocation(10, 10);
    JDesktopPane pane = new JDesktopPane();
    pane.add(frame);
    f.setContentPane(pane);

    try 
    {
        frame.setSelected(true);
    } 
    catch (java.beans.PropertyVetoException e) 
    {
        e.printStackTrace();
    }
}

如果有人知道如何正确执行此操作,请发布它,或告诉我我做错了什么。

细节

操作系统:Windows 7

JDK:JDK 1.7.0_11

IDE:日食

我在 jframe 上使用面板,我正在面板上绘图

绘画代码

public void paintComponent(Graphics g)
{
    super.paintComponent(g);

    for(int i = 0; i<1000; i++)
        g.drawImage(bi, i*bi.getWidth()-getXs(), 0, bi.getWidth(), Main.HEIGHT, null);

    g.setColor(Color.WHITE);

    for(int x = 0; x<Main.X_TILES; x++)
    {
        for(int y = 0; y<Main.Y_TILES; y++)
        {
            Block block = map[x][y];

            if(block!=null && x*Block.WIDTH>=xs-Block.WIDTH && x*Block.WIDTH<=xs+Main.WIDTH)
                g.drawImage(block.getImage(x,y), x*Block.WIDTH-getXs(), y*Block.HEIGHT, Block.WIDTH, Block.HEIGHT, null);
        }
    }

    for(Entity entity : entities)
    {
        if(entity!=null && entity.getX()>=xs-Block.WIDTH && entity.getX()<=xs+Main.WIDTH)
            g.drawImage(entity.getImage(), entity.getX()-getXs(), entity.getY(), entity.getWidth(), entity.getHeight(), null);
    }

    if(displayDebug)
    {
        g.drawString("Free memory "+Runtime.getRuntime().freeMemory()/1024+" KB", 10, 12);
        g.drawString("Total memory "+Runtime.getRuntime().totalMemory()/1024+" KB", 10, 24);
        g.drawString("Max memory "+Runtime.getRuntime().maxMemory()/1024+" KB", 10, 36);
        g.drawString("X "+character.getX(), 10, 48);
        g.drawString("Y "+character.getY(), 10, 60);
        g.drawString("XS "+xs, 10, 72);
    }

    g.setColor(Color.BLACK);
    g.drawString("Life "+character.getHealth(), 700, 12);
    g.dispose();
}

我在全屏模式下看到了一个类似问题 JInternalFrame 的答案,说直接放在面板上,但我试过了,它仍然没有用。

编辑:当我注释掉我的绘画代码时,我将它直接添加到面板而不是它的工作,但它不会拖动,所以我的新问题是如何在完成绘画工作时让它出现。他们是一种使用绘画组件绘制组件的方法吗?

为了澄清,在没有绘画代码的情况下添加到面板时仍然无法正常工作。

4

1 回答 1

1

你是说你在你的框架中添加了一个 JPanel(第二个代码片段),但实际上你正在用这一行中的 JDesktopPane 替换你的框架的全部内容:

f.setContentPane(pane);

因此,除非您在 Frame 的玻璃窗格中的某处或类似奇怪的某处添加您的游戏面板(具有覆盖 paintComponent 方法的那个),否则它将永远不会显示,因为 JDesktopPane(以及您添加到其中的 JInternalFrame)是唯一的组件此时的框架。

此外,为了完整起见,您应该将 setVisible(true) 调用移到初始化的最后(即之后createFrame(f);),并完全删除您的paintComponent 方法(g.dispose();)中对 dispose() 的调用。

至少这是我想象的情况,尝试发布一个更简洁和独立的示例,如果这没有帮助,可以展示您遇到的问题。

这是一个修改后的示例,它将在同一个全屏组件中显示自定义图形(在本例中仅为文本)和 JInternalFrame:

public class FrameTest {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setTitle("Platform Game");
        f.setLocationRelativeTo(null);
        f.setUndecorated(true);
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gs = ge.getDefaultScreenDevice();
        gs.setFullScreenWindow(f);

        JDesktopPane pane = new MyPanel();
        JInternalFrame frame = new JInternalFrame("Options", false, true, false, false);
        frame.setVisible(true);
        frame.setSize(100, 100);
        frame.setLocation(10, 10);
        pane.add(frame);
        f.setContentPane(pane);

        f.setVisible(true);
    }

    private static class MyPanel extends JDesktopPane {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.setColor(Color.BLACK);

            g.drawString("Free memory " + Runtime.getRuntime().freeMemory() / 1024 + " KB", 10, 12);
            g.drawString("Total memory " + Runtime.getRuntime().totalMemory() / 1024 + " KB", 10, 24);
            g.drawString("Max memory " + Runtime.getRuntime().maxMemory() / 1024 + " KB", 10, 36);
        }
    }
}
于 2013-04-05T16:14:50.497 回答