【问题标题】:Dynamically changing the size of JFrame when exposed to different screen resolutions在不同屏幕分辨率下动态改变 JFrame 的大小
【发布时间】:2016-11-11 19:46:42
【问题描述】:

因此,对于一个学校项目,我用 Java 制作了一本成绩册。创建 gui 时,我在 setBounds() 方法中使用了硬编码值。现在,当我的屏幕分辨率为 1024×768 时,它看起来还不错,但是当我买了一台新笔记本电脑并且它的屏幕为 4k 时,它在我运行程序时看起来超级小。

所以我的问题是有没有办法动态改变Jframe 和框架上所有相关对象的大小,使其与屏幕分辨率相匹配?

我知道你可以从这里得到屏幕分辨率

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

double width = screenSize.getWidth();

double height = screenSize.getHeight();

但我不知道最好的方法是什么。

【问题讨论】:

  • 只需插入一个您觉得合适的窗口/屏幕比例并设置 JFrame 大小。 PS:如果你正在寻找在运行时设置窗口大小(在它被绘制之后),你必须在 Swing 线程上调用 revalidate() 和 repaint()。
  • 停止使用 setBounds()。使用布局管理器。正如所有挥杆教程中所解释和推荐的那样。 docs.oracle.com/javase/tutorial/uiswing/layout/index.html
  • 了解如何使用布局管理器。设置尺寸不是要走的路。

标签: java


【解决方案1】:

以你的方法为例,以this answerthis tutorial为基础,你有线索:

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;


public class Q1 extends JFrame {
    public static void main(String[] args) {
        Q1 frame = new Q1();

        frame.setSize(300, 300);
        frame.setMinimumSize(new Dimension(300, 300));
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);     
    }

    public Q1() {
        this.addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                // This is only called when the user releases the mouse button.
                System.out.println("componentResized");
            }
        });
    }

    @Override
    public void validate() {
        resize();
        super.validate();

    };

    private void resize() {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        double width = screenSize.getWidth();

        double height = screenSize.getHeight();

        System.out.println(width + "," + height);
    }
}

这将在您调整框架大小时打印屏幕大小,因此您只需在调整大小方法中添加一个 if/else 以使框架更大

输出

1366.0,768.0
1366.0,768.0
componentResized
1366.0,768.0
1366.0,768.0
componentResized
1366.0,768.0
1366.0,768.0
componentResized

【讨论】:

    【解决方案2】:

    布局管理器是一个实现 LayoutManager 的对象 interface* 并确定组件的大小和位置 一个容器内。尽管组件可以提供大小和对齐方式 提示,容器的布局管理器对大小和 组件在容器中的位置。

    查看我找到的使用布局管理器的示例。希望您有所了解。原作者是here 设置一个布局管理器,如 BorderLayout,然后更具体地定义您的面板应该去哪里:like

    MainPanel mainPanel = new MainPanel();
    JFrame mainFrame = new JFrame();
    mainFrame.setLayout(new BorderLayout());
    mainFrame.add(mainPanel, BorderLayout.CENTER);
    mainFrame.pack();
    mainFrame.setVisible(true);
    

    将面板放入框架的中心区域,并在调整框架大小时使其自动增长。完整用法请参见下面的示例:

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.GridBagLayout;
    import java.awt.GridLayout;
    import javax.swing.BorderFactory;
    import javax.swing.Box;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class TestLayoutManagers {
    
        private JPanel northFlowLayoutPanel;
        private JPanel southBorderLayoutPanel;
        private JPanel centerGridBagLayoutPanel;
        private JPanel westBoxLayoutPanel;
        private JPanel eastGridLayoutPanel;
    
        private final JButton northButton = new JButton("North Button");
        private final JButton southButton = new JButton("South Button");
        private final JButton centerButton = new JButton("Center Button");
        private final JButton eastButton = new JButton("East Button");
        private final JButton westButton = new JButton("West Button");
    
        public TestLayoutManagers() {
            northFlowLayoutPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
            southBorderLayoutPanel = new JPanel(new BorderLayout());
            centerGridBagLayoutPanel = new JPanel(new GridBagLayout());
            eastGridLayoutPanel = new JPanel(new GridLayout(1, 1));
            Box box = Box.createHorizontalBox();
            westBoxLayoutPanel = new JPanel();
    
            northFlowLayoutPanel.add(northButton);
            northFlowLayoutPanel.setBorder(BorderFactory.createTitledBorder("Flow Layout"));
    
            southBorderLayoutPanel.add(southButton);
            southBorderLayoutPanel.setBorder(BorderFactory.createTitledBorder("Border Layout"));
    
            centerGridBagLayoutPanel.add(centerButton);
            centerGridBagLayoutPanel.setBorder(BorderFactory.createTitledBorder("GridBag Layout"));
    
            eastGridLayoutPanel.add(eastButton);
            eastGridLayoutPanel.setBorder(BorderFactory.createTitledBorder("Grid Layout"));
    
            box.add(westButton);
            westBoxLayoutPanel.add(box);
            westBoxLayoutPanel.setBorder(BorderFactory.createTitledBorder("Box Layout"));
    
            JFrame frame = new JFrame("Test Layout Managers");
            frame.setLayout(new BorderLayout());      // This is the deafault layout
            frame.add(northFlowLayoutPanel, BorderLayout.PAGE_START);
            frame.add(southBorderLayoutPanel, BorderLayout.PAGE_END);
            frame.add(centerGridBagLayoutPanel, BorderLayout.CENTER);
            frame.add(eastGridLayoutPanel, BorderLayout.LINE_END);
            frame.add(westBoxLayoutPanel, BorderLayout.LINE_START);
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
            frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    
    }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    TestLayoutManagers testLayoutManagers
                            = new TestLayoutManagers();
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多