【问题标题】:How to set java application to adopt the varying screensizes?如何设置java应用程序采用不同的屏幕尺寸?
【发布时间】:2017-06-28 05:55:25
【问题描述】:

我正在尝试以全屏尺寸运行我的应用程序。它包含一个完全被面板覆盖的框架。我试过这段代码

Toolkit tk=this.getDefaultToolkit();
this.setSize(tk.getScreenSize.getWidth(),tk.getScreenSize.getHeight());

我还在 setExtendedState 中尝试了 MAXIMIZED_BOTH。那也行不通。我认为问题出在 jPanel 但不确定。它在小屏幕尺寸中只有一半可见,但框架在所有屏幕尺寸下都获得全尺寸。我已经为面板启用了自动调整大小。 这里是应用程序在大屏幕和小屏幕中的图像

【问题讨论】:

  • 核心将围绕如何计算组件首选大小以及您使用的布局管理器。 this.setSize(tk.getScreenSize.getWidth(),tk.getScreenSize.getHeight()); 绝对不是正确的道路,因为它没有考虑任务栏之类的东西
  • 是的,谢谢@ItamarGreen 的回复。在所有屏幕尺寸中,框架都获得全屏。但是面板(图中蓝色)没有采用框架尺寸。
  • @MadProgrammer 谢谢。我正在使用netbeans。它的免费设计布局。我也尝试过边框布局。你能建议我如何解决这个问题吗?
  • 使用布局组合。现在,我只看到BorderLayoutGridLayoutGridBagLayout 被使用了

标签: java swing jframe


【解决方案1】:

正确使用各种布局管理器可以大大提高 UI 动态调整大小的能力

根据您问题中的屏幕截图,我看到 BorderLayoutGridLayout 和可能的 GridBagLayout 作为主要选择

窗口“打包”

窗口“最大化”

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class JavaApplication170 {

    public static void main(String[] args) {
        new JavaApplication170();
    }

    public JavaApplication170() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TopPane(), BorderLayout.NORTH);
                frame.add(new LeftPane(), BorderLayout.WEST);
                frame.add(new JScrollPane(new FieldsPane()));
                frame.pack();
                //frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TopPane extends JPanel {

        public TopPane() {
            setLayout(new GridLayout(1, 0));
            add(new JLabel("Some title"));
            add(new JButton("One"));
            add(new JButton("Two"));
            add(new JButton("Three"));
            add(new JButton("Four"));
        }

    }

    public class LeftPane extends JPanel {

        public LeftPane() {
            setLayout(new GridLayout(0, 1));
            add(new JButton("One"));
            add(new JButton("Two"));
            add(new JButton("Three"));
            add(new JButton("Four"));
            add(new JButton("Five"));
            add(new JButton("Six"));
            add(new JButton("Seven"));
        }

    }

    public class FieldsPane extends JPanel {

        public FieldsPane() {
            setLayout(new GridBagLayout());
            addField("Field one", 0);
            addField("Field two", 1);
            addField("Field three", 2);
            addField("Field four", 3);
            addField("Field five", 4);
            addField("Field six", 5);
            addField("Field seven", 6);
            addField("Field eight", 7);
            addField("Field nine", 8);
            addField("Field ten", 9);
            addField("Field eleven", 10);
            addField("Field tweleve", 11);

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridheight = 3;
            gbc.gridx = 2;
            gbc.gridy = 1;
            //gbc.weightx = 1;
            add(makeProfileLabel(), gbc);

            gbc.gridheight = 1;
            gbc.gridy += 3;
            add(new JButton("Some button"), gbc);
        }

        protected void addField(String text, int row) {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = row;
            gbc.insets = new Insets(4, 4, 4, 4);
            add(new JLabel(text), gbc);
            gbc.gridx++;
            add(new JTextField(10), gbc);
        }

        protected JLabel makeProfileLabel() {
            JLabel label = new JLabel();
            label.setPreferredSize(new Dimension(50, 50));
            label.setBorder(new LineBorder(Color.BLACK));
            return label;
        }

    }

}

现在,这是一个相对简单的示例,旨在演示使用多个布局的概念。

例如,我可能想使用另一个GridBagLayout 来布置“主”布局,这样我可以更好地控制“某些标题”标签

布局可能有点像(黑魔法)艺术形式,但如果您从“基本”需求开始,查看 UI 试图产生的功能并将这些需求分解,这会比尝试更容易将所有内容转储到单个组件中

【讨论】:

    【解决方案2】:

    我猜thisJFrame。在某些时候,您将主要的panel 添加到框架中。

    this.add(panel);
    

    相反,将panel 包装在JScrollPaneadd() that 到框架中。

    JScrollPane scrollPane = new JScrollPane(panel);
    this.add(scrollPane);
    this.pack();
    this.setExtendedState(getExtendedState() | MAXIMIZED_BOTH);
    this.setVisible(true);
    

    如果我们调整组件的大小以适应屏幕大小而不是使用scrollPane 会更好。

    这里有一些其他的想法:

    • 尽可能使用size variant

    • 减少注册面板中的任何间隙,例如setHgap()setVgap() 代表 GridLayout

    • 只是注册面板Scrollable

    【讨论】:

    • 是的,谢谢。但这不会很好。如果我们调整组件大小以适应屏幕大小而不是使用scrollpane 会更好
    • 好的。我在上面添加了一些其他的想法。更新您的问题,以便其他人知道您不想要 JScrollPane
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多