在全屏模式下运行应用程序时,Java Swing 无法找出 JPanel 的问题

Posted

技术标签:

【中文标题】在全屏模式下运行应用程序时,Java Swing 无法找出 JPanel 的问题【英文标题】:Java Swing cannot figure out a problem with JPanel when running the app in full-screen mode 【发布时间】:2021-11-21 07:15:17 【问题描述】:

当我在全屏模式下运行应用程序时,没有访问 MainPanel 类的构造函数。只有当我单击菜单栏中的任何项目时才能访问它。

应用程序在窗口模式下或当我手动设置框架的宽度和高度时运行良好。

app running in windowed-mode or when I set width and height (working fine)

app running in full-screen mode but the MainPanel() constructor is not being called

app running in full-screen mode after clicking on any of the menu item (the MainPanel() constructor in called)

Main.java

    public class Main 
        public static void main(String[] args) 
            AppFrame mainFrame = new AppFrame("Algorithm Visualizer");
            mainFrame.add(new MainPanel());
        
    

MainPanel.java

    public class MainPanel extends JPanel 
        MainPanel() 
            this.setBackground(Color.BLACK);
        
    

AppFrame.java

    class AppFrame extends JFrame implements ActionListener  
            private JMenuBar menuBar;
            private JMenu fileMenu, sortingAlgoMenu, searchingAlgoMenu;
            private JMenuItem exitItem, bubbleSortItem;
        
            // constructor with frame_title and auto app resolution
            AppFrame(String frameTitle) 
                // sets the app theme
                setTheme();
        
                // Frame Properties
                this.setTitle(frameTitle);
                this.setDefaultCloseOperation(EXIT_ON_CLOSE);
                this.setResizable(false);
        
                GraphicsDevice myDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
            
                // this is the code that makes the frame full-screen
                if(myDevice.isFullScreenSupported()) 
                    this.setUndecorated(true);
                    myDevice.setFullScreenWindow(this);
                
                else 
                    // windowed mode (title bar present)
                    int deviceWidth = myDevice.getDisplayMode().getWidth();
                    int deviceHeight = myDevice.getDisplayMode().getHeight();
                    
                    this.setSize(deviceWidth, deviceHeight);
                    this.setLocationRelativeTo(null);
                
        
                // adds the MenuBar
                addMenuBar();
        
                // makes the JFrame visible
                this.setVisible(true);
            
        
            // constructor passed with app title, width and height
            AppFrame(String frameTitle, int frameWidth, int frameHeight) 
                // sets the app theme
                setTheme();
        
                // Frame Properties
                this.setTitle(frameTitle);
                this.setDefaultCloseOperation(EXIT_ON_CLOSE);
                this.setResizable(false);
                this.setSize(frameWidth, frameHeight);
                this.setLocationRelativeTo(null);
        
                // adds the MenuBar
                addMenuBar();
        
                // makes the JFrame visible
                this.setVisible(true);
            
        
            // sets the theme of the application
            private static void setTheme() 
                try 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                 
                catch (ClassNotFoundException e) 
                    e.printStackTrace();
                 
                catch (InstantiationException e) 
                    e.printStackTrace();
                 
                catch (IllegalAccessException e) 
                    e.printStackTrace();
                 
                catch (UnsupportedLookAndFeelException e) 
                    e.printStackTrace();
                
            
        
            //  setting the JMenuBar
            private void addMenuBar() 
                menuBar = new JMenuBar();
        
                fileMenu = new JMenu("File");
                menuBar.add(fileMenu);
        
                sortingAlgoMenu = new JMenu("Sorting Algorithms");
                searchingAlgoMenu = new JMenu("Searching Algorithms");
        
                menuBar.add(sortingAlgoMenu);
                menuBar.add(searchingAlgoMenu);
        
                exitItem = new JMenuItem("Exit");
                bubbleSortItem = new JMenuItem("Bubble Sort");
        
                fileMenu.add(exitItem);
                sortingAlgoMenu.add(bubbleSortItem);
        
                // on-click of "Exit" 
                exitItem.addActionListener(this);
        
                this.setJMenuBar(menuBar);
            
        
            // handle action events (on-click listeners)
            @Override
            public void actionPerformed(ActionEvent e) 
                if(e.getSource() == exitItem)
                    System.exit(0);
            
        

【问题讨论】:

在使框架可见之前,需要将组件添加到框架中。 不知道这两种模式有什么区别。忘记差异并学习如何有效地使用 Swing,您不会在两种模式之间遇到问题。在调用布局管理器之前,Swing 组件的大小为 (0, 0)。当框架可见(或打包)时调用布局管理器。如果将组件添加到可见框架,则需要 revalidate() 和 repaint() 将组件添加到的面板,以便调用布局管理器。 @camickr 谢谢理解。 【参考方案1】:

只需在 addMenuBar() 之前的应用框架中添加 MainPanel。无论如何都会调用构造函数,但 MainPanel 不可见。

【讨论】:

【参考方案2】:

我发现我做错了什么。在添加 JPanel 之前,我让 JFrame 可见。所以,我只是从 AppFrame 类中删除了框架可见性,并在添加 JPanel 后从 Main.class 中设置了它的可见性(true)。

【讨论】:

以上是关于在全屏模式下运行应用程序时,Java Swing 无法找出 JPanel 的问题的主要内容,如果未能解决你的问题,请参考以下文章

window.navigator.standalone 检测iOS WebApp是否运行在全屏模式

在全屏独占模式下输入 JtextField 时出现问题

Electron 应用程序 - 如何在全屏模式下禁用/隐藏任务栏中的窗口

为啥 Direct3D 应用程序在全屏模式下表现更好?

Pygame 窗口在全屏模式下没有响应

在全屏模式下添加 MPMoviePlayerController?