当前位置: 首页 > 面试题库 >

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

督德泽
2023-03-14
问题内容

我做了一个将我的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渲染不正确?

我的意思是说,在我的黑色背景上有一个很大的灰色JPanel,没有JButton呈现。


问题答案:

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

Kingdomcraft#main,创建实例Screen和调用screen.run(),它创建的实例KindomcraftMainMenu以及Screen......别急,我们Screen,为什么我们需要另一个实例?然后,您继续向的this实例添加内容Screen,而将实例保留为screen空白…

真正奇怪的是,您要将的实例传递screenifFullscreen(这是空白版本),然后将其尝试使其全屏显示…上面没有任何内容…但ifNotFullscreen实际上使用了this???

甚至更奇怪…当您MainMenu#run从调用时Screen#run,您创建的新实例KingdomcraftMainMenu然后Screen…再次…

fullscreen按钮被付诸行动,你传递给它的引用screen您创建的MainMenu,这是不是有它的内容,哪些应该在屏幕上显示一个…

基本上,您似乎不了解做什么new以及对象实例之间的区别。一个新实例与同一对象的任何其他实例都没有关系…

你应该做的是路过的参考KingdomcraftScreen,然后传递的参考ScreenMainMenu。这些类都不应该创建自己的实例或实例KingdomcraftScreen

链中的每个链接都应该能够提供对前一个链接的访问,因此MainMenu应该能够请求对它Screen的引用Kingdomcraft

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

有关更多详细信息,请参见Swing中的并发。

从事物的外观来看,我认为您需要回到基础知识,并研究对象引用的工作原理



 类似资料:
  • 问题内容: 我已经尝试了两个类组件: 并使用功能组件: 页面上显示的x值永远不会改变,或者似乎是随机改变的。是什么赋予了? 问题答案: 当您告诉React某些更改时,React仅知道使用其为状态管理提供的功能来重新渲染: 另外,功能组件应该是 纯 组件(没有副作用),因此要更新它们,React会给我们带来麻烦: 因此,您不能只是分配给一个变量并期望React知道:您必须使用它的更新函数,以便它知道

  • 我刚刚安装了Ubuntu desktop 12.04并通过以下方式安装了Java 6 JDK: 但是当我转到时,我没有看到一个名为的目录,所以我认为它根本不存在!?! 当我转到时,我看到: 我现在正试图将作为环境变量添加到中,以便从基于shell的Ant构建中访问它: ? ? 还有别的吗? 我所说的“”是指我在系统上安装的JDK6的顶级目录,无论它在哪里······

  • 问题内容: 由于某种原因,当我添加到优先级队列时,它不能完全按字母顺序对字符串进行排序,也无法理解原因。 这是添加到PriorityBlockingQueue的代码: 但是我没有得到完全排序的输出(只有前几行,但是您可以看到它没有排序): 这是预期输出文件中排序输出的实数(第一部分): 问题答案: 我怀疑您正在尝试迭代并打印元素。 请注意,优先级队列数据结构(AKA heap)不能保证排序- 它保

  • 问题内容: 如果用户将焦点放在当前窗口上并按一个键,我将打印相关信息。但是,它适用于某些键,例如“ a”,但不适用于“ tab”。这是一个简单的演示: 我该怎么做才能达到目标?提前致谢。 问题答案: 引自《如何使用Focus子系统》(Java™教程>使用JFC / Swing创建GUI>使用其他Swing功能) (由@ alex2410建议(链接到@camickr帖子)和@mKorbel建议):

  • 问题内容: 我正在尝试使用GoLang,接口和结构继承。 我创建了一组结构,其想法是可以将常见方法和值保留在核心结构中,然后仅继承此结构并适当添加其他值: 您还可以在下面的游乐场中找到: https://play.golang.org/p/OxzuaQkafj 但是,当我运行main方法时,年龄保持为“ 21”,并且不会被SetAge()方法更新。 我试图了解为什么会这样,以及我需要做些什么才能使

  • 当我将本地值设置为1时,操作正常,但当设置为2时,错误消息报告如下