为什么我的jar文件GUI可以在我的计算机上完美显示,而不能在另一台计算机上显示?

问题描述 投票:0回答:1

我使用Java开发了基于GUI的应用程序。我用GridBagLayout来构建UI。而且,当我在系统上运行jar文件时,UI会根据需要看起来很完美。 (请参见下图)

enter image description here

但是当我在其他计算机上运行相同的jar文件时,UI如下所示,

  1. [Jtextfield变得像[]这样,不允许用户输入输入。
  2. 窗口大小已更改。您可以看到框架上的标题被截断了。

enter image description here

下面是我在测试窗格中使用的代码。

        public TestPane() {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        try {
            URL url = getClass().getResource("alarm5.jpg");
            image = ImageIO.read(url);
        } catch (IOException ex) {
            System.out.println("Error: "+ex);
        }

        Font myFont = new Font("Calibri", Font.PLAIN | Font.BOLD, 16);
        Font myFont2 = new Font("Calibri", Font.PLAIN | Font.BOLD, 14);

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.WEST;
        selectall = new JCheckBox("Select all");
        selectall.setForeground(Color.WHITE);
        selectall.setOpaque(false);
        selectall.setFont(myFont);
        selectall.addActionListener(this);
        add(selectall, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.anchor = GridBagConstraints.WEST;
        monday = new JCheckBox("Monday");
        monday.setForeground(Color.WHITE);
        monday.setOpaque(false);
        monday.setFont(myFont2);
        monday.addActionListener(this);
        add(monday, gbc);

        gbc.gridx = 0;
        gbc.gridy = 2;
        tuesday = new JCheckBox("Tuesday");
        tuesday.setForeground(Color.WHITE);
        tuesday.setOpaque(false);
        tuesday.addActionListener(this);
        tuesday.setFont(myFont2);
        add(tuesday, gbc);

        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.anchor = GridBagConstraints.WEST;
        wednesday = new JCheckBox("Wednesday");
        wednesday.setForeground(Color.WHITE);
        wednesday.setOpaque(false);
        wednesday.addActionListener(this);
        wednesday.setFont(myFont2);
        add(wednesday, gbc);

        gbc.gridx = 0;
        gbc.gridy = 4;
        gbc.anchor = GridBagConstraints.WEST;
        thursday = new JCheckBox("Thursday");
        thursday.setForeground(Color.WHITE);
        thursday.setOpaque(false);
        thursday.addActionListener(this);
        thursday.setFont(myFont2);
        add(thursday, gbc);

        gbc.gridx = 0;
        gbc.gridy = 5;
        friday = new JCheckBox("Friday");
        friday.setForeground(Color.WHITE);
        friday.setOpaque(false);
        friday.addActionListener(this);
        friday.setFont(myFont2);
        add(friday, gbc);

        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.anchor = GridBagConstraints.WEST;
        saturday = new JCheckBox("Saturday");
        saturday.setForeground(Color.WHITE);
        saturday.setOpaque(false);
        saturday.addActionListener(this);
        saturday.setFont(myFont2);
        add(saturday, gbc);

        gbc.gridx = 1;
        gbc.gridy = 2;
        gbc.anchor = GridBagConstraints.WEST;
        sunday = new JCheckBox("Sunday");
        sunday.setForeground(Color.WHITE);
        sunday.setOpaque(false);
        sunday.addActionListener(this);
        sunday.setFont(myFont2);
        add(sunday, gbc);

        gbc.gridx = 0;
        gbc.gridy = 7;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridwidth = 2;
        gbc.insets = new Insets(10, 0, 0, 0);
        JLabel env = new JLabel("At what time, should i remind you? ");
        env.setForeground(Color.WHITE);
        env.setFont(myFont);
        add(env, gbc);      

        gbc.gridx = 3;
        gbc.gridy = 7;
        gbc.insets = new Insets(10, 0, 10, 0);
        gbc.fill = GridBagConstraints.HORIZONTAL;
        final JTextField tm = new JTextField(5);
        tm.setText("21:00:00");
        tm.setToolTipText("Input should be in HH:MM:SS format and time format should be 24 hours.");
        add(tm, gbc);

        gbc.gridx = 1;
        gbc.gridy = 8;
        gbc.fill = GridBagConstraints.NONE;
        gbc.gridwidth = 2;
        Set = new JButton(" Set ");
        Set.setFocusable(false);
        add(Set, gbc);
        }

下面是我用于框架的代码。

                frame2 = new JFrame("Select days and time");
                frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame2.setLayout(new BorderLayout());
                frame2.add(new TestPane());
                frame2.pack();
                frame2.setResizable(false);
                frame2.setLocationRelativeTo(null);
                frame2.setVisible(true);
                frame2.setAlwaysOnTop(true);

两个系统都具有相同的分辨率设置。你能在这里帮我吗?如何在任何系统上使外观相同?以及如何解决JTextfield问题?

报警图像:

enter image description here

java swing jframe gridbaglayout runnable-jar
1个回答
1
投票

您发布的代码不是minimal, reproducible example。我假设您将图像设置为TestPane类的背景,但是缺少执行该操作的代码。您发布的警报图像为HUGE。我将其缩小为原始大小的30%。之后,您只需要在类setPreferredSize()的构造函数中调用TestPane。对我来说,宽度450和高度260可以很好地工作,即

public TestPane() {
    setPreferredSize(new Dimension(450, 260);
    // Rest of your code unchanged.
}

这是我计算机上的外观。

alarm

© www.soinside.com 2019 - 2024. All rights reserved.