将定义的Jframe大小转换为基于屏幕大小的自动调整大小

问题描述

我正在研究Java项目,二进制时钟以及API的天气统计信息。最初编写它时,我犯了一个错误,即将帧大小定义为屏幕的特定分辨率。现在,我已经购买了具有不同屏幕尺寸的新笔记本电脑,我已经认识到自己的错误,而且不确定如何解决。 (由于我的旧笔记本电脑是4k,而我的新笔记本电脑不是,所以全部关闭了。)

基于我的面板的已定义尺寸和框架尺寸,所有组件的尺寸也均已定义 .setSize(2000,1500);我尝试插入

           Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
           frame.setBounds(0,screenSize.width,screenSize.height);

在我的框架中:

               JFrame frame = new JFrame("12-Hour Binary Clock");
               frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
               frame.setSize(2000,1500);
               frame.getContentPane().setBackground(Color.DARK_GRAY.darker().darker().darker());
               frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

以及修改我的主面板Panel,其中所有组件都位于其中:

       JPanel Panel = new JPanel();
       Panel.setLayout(null);
       Panel.setSize(2000,1500);
       Panel.setBackground(null);
       Panel.setLocation(400,100);
       Panel.setVisible(true);

       JPanel Panel = new JPanel();
       Panel.setLayout(null);
       Panel.setSize(screenSize.width,screenSize.height);
       Panel.setBackground(null);
       Panel.setLocation(400,100);
       Panel.setVisible(true);

将所有内容添加Panel,并将Panel添加frame

   //adding components to panel and panel to frame at end of program
   Panel.add(inner);
   Panel.add(labelOne); //JLabel components inside Panel
   Panel.add(labelTwo);
   Panel.add(labelFour);
   Panel.add(labelEight);
   frame.add(weather);
   frame.add(Panel,BorderLayout.CENTER);   

但是它似乎没有任何作用。 我不认为我该怎么做。考虑到我绝对不正确,任何提示都值得赞赏。

我不确定是否只需要调整Panelframe的大小,因为那是所有内容的全部,但是由于它什么也没做,因此我似乎必须做更多。我需要调整所有组件的尺寸吗?

也不确定为什么我将Panel的大小设置为与frame相同,而不是将所有内容添加frame中。很久以后,我将重新访问此代码

解决方法

由于布局为null,因此当窗口更改大小时,组件很可能不会自行调整大小。您将不得不手动移动组件并调整其大小以适合窗口或添加布局。

我建议使用BorderLayout,GridLayout或两者结合使用,具体取决于GUI的先进程度。学习布局的一种好方法是使用Oracle教程:

BorderLayout: https://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

GridLayout: https://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html