当我将程序设置为全屏时,为什么JPanel无法正确呈现?

时间:2014-03-17 19:50:42

标签: java swing jbutton

我制作了一个将我的JFrame设置为全屏的JButton:

    add(fullscreen);

    fullscreen.setSize(100, settings.getHeight());
    fullscreen.setLocation(settings.getX() + (settings.getWidth() / 2) - 50, light.getY() + 35);

    fullscreen.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {

        if(isFullscreen) {

            isFullscreen = false;

            screen.ifNotFullscreen();
        }


        if(!isFullscreen) {

            isFullscreen = true;

            screen.ifFullscreen(screen);
        }

        mm.revalidate();
    }
});

这是JFrame:

public class Screen extends JFrame {

    private Kingdomcraft kd;
    private MainMenu mm;
    private Screen screen;
    private Dimension min = new Dimension(800, 600);
    private ImageIcon img;

    public void run() {

        kd = new Kingdomcraft();
        mm = new MainMenu();
        screen = new Screen();
        img = new ImageIcon("assets/textures/items/ItemSwordIron.png");

        this.add(kd);
        this.setContentPane(mm);
        this.setLocationRelativeTo(null);
        this.setTitle("Kingdomcraft");
        this.setIconImage(img.getImage());
        this.setBackground(Color.BLACK);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        mm.setOpaque(false);
        mm.run();

        if (mm.isFullscreen) {

            ifFullscreen(screen);
        }

        if (!mm.isFullscreen) {

            ifNotFullscreen();
        }
    }

    public void ifFullscreen(Screen screen) {

        this.screen = screen;
        this.setVisible(true);

        GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(screen);

        repaint();
    }

    public void ifNotFullscreen() {

        this.setMinimumSize(min);
        this.setResizable(true);
        this.setVisible(true);

        repaint();
    }
}

为什么当我运行游戏并选择JButton全屏时,JPanel呈现错误?

就此而言,我的意思是在我的黑色背景上有一个没有JButton的大灰色JPanel。

1 个答案:

答案 0 :(得分:1)

问题是你正在创建多个不同的Screen实例,但你完全不知道哪一个实际上在屏幕上可见。

Kingdomcraft#main,创建Screen的实例并调用screen.run(),这会创建KindomcraftMainMenuScreen的实例。但是等等,我们是Screen,为什么我们需要另一个实例?然后,您继续向this的{​​{1}}实例添加内容,将Screen的实例留空......

真的很奇怪,你会将screen的实例传递给screen(这是空白版本),然后尝试将其全屏显示......没有任何内容......但ifFullscreen实际使用ifNotFullscreen ???

甚至更奇怪......当您从this致电MainMenu#run时,您创建了Screen#runKingdomcraftMainMenu的新实例...... AGAIN ...

Screen按钮被操作时,您传递的是您在fullscreen中创建的screen的引用,该引用不是包含内容且应显示的内容的MainMenu在屏幕上......

基本上,您似乎不了解new的作用以及对象实例之间的差异。新实例与同一对象的任何其他实例无关......

您应该做的是将Kingdomcraft的引用传递给Screen,然后将Screen的引用传递给MainMenu。这些类都不应该创建自己的实例或KingdomcraftScreen

的实例

链中的每个链接都应该能够提供对上一个链接的访问权限,以便MainMenu能够在需要时Screen询问Kingdomcraft的引用。

另外,Swing不是线程安全的。您永远不应该与事件调度线程以外的任何线程中的任何组件进行交互。

有关详细信息,请参阅Concurrency in Swing

从外观上看,我认为你需要回归基础并研究对象引用的工作原理......