在全屏模式下运行应用程序时,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是否运行在全屏模式