【问题标题】:Parts of JComponents incompatible with Ubuntu?部分 JComponents 与 Ubuntu 不兼容?
【发布时间】:2014-11-19 06:36:57
【问题描述】:

我有一个程序,它在一个 JFrame 中输出计算结果,该 JFrame 包含一个 JPanel(用于可扩展性),其中包含一个 JLabel,它显示所述输出(这是一个字符串)。

我发现 JLabel 的默认字体相当小且难以阅读,因此增加了字体大小并将其替换为 Windows 特定的字体,但我并没有考虑太多,因为我检查了一个不支持的字体存在,并注意到即使字体不存在,程序也能正常工作。 (在 Windows 7 和 8 上)

但是,在 Ubuntu 上运行时,结果是一个最小尺寸的 JFrame。

所以现在我想知道这是否是 JVM 上某些不兼容的示例,或者是运行它的 Ubuntu 副本的问题。

如果这是 JVM 问题,下面的代码应该会在 Ubuntu(或者一般的 Linux)上复制问题。

import java.awt.BorderLayout;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Main {
    public Main(){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel lbl = new JLabel("SOME TEXT");
        lbl.setFont(new Font("font that doesnt exist", Font.PLAIN, 20));
        JPanel pnl = new JPanel();
        pnl.add(lbl);
        frame.add(pnl, BorderLayout.CENTER);
        frame.setVisible(true);
        frame.pack();
        frame.setLocationRelativeTo(null);
    }

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

PS Ubuntu 计算机不是我的,所以我无法完全按照我的意愿进行测试

【问题讨论】:

  • 确保从 EDT 上下文中启动 UI,有关详细信息,请参阅 Initial Threads
  • 另外,我有点想知道您对 lbl.setFont(new Font("font that doesnt exist", Font.PLAIN, 20))frame.pack(); 的期望...
  • @MadProgrammer 我没有为正确的实现而烦恼,因为该程序只显示一个结果。它不需要任何输入,也不需要更新其输出,也不需要很长时间来计算输出。
  • @MadProgrammer 我不明白你在第二条评论中的意思。
  • 我不确定如果字体不存在 Java/Swing 会做什么,但是如果它不能确定字体的字体度量,它就无法计算首选大小组件的大小,因此,窗口的首选大小

标签: java linux windows swing compatibility


【解决方案1】:

在 Ubuntu 14、Java 7 上进行测试,字体替换似乎以通常的方式工作。请注意需要调用pack()然后 setVisible(),以及在EDT 上启动UI。

import java.awt.Font;
import java.awt.GridLayout;
import java.io.File;
import javax.swing.*;

public class TestFrame extends JFrame {

    public TestFrame() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new GridLayout(0, 1));
        JLabel label1 = new JLabel("Some big, bold, serif text.");
        label1.setFont(new Font(Font.SERIF, Font.BOLD, 24));
        this.add(label1);
        JLabel label2 = new JLabel("Some big, bold, default text.");
        label2.setFont(new Font("42", Font.BOLD, 24));
        this.add(label2);
        this.pack();
        this.setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestFrame().setVisible(true);            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 2018-07-04
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2020-10-27
    • 2020-02-20
    相关资源
    最近更新 更多