1

在将原生外观应用到我的 JFrame 时,我遇到了一个问题,所有文本(HTML 格式的 JLabel 除外)都有丑陋的粗体字体。

以下代码中非常简单的 UI 总结了我在 L&F 中看到的所有差异:

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;

public class HelloWorld extends JFrame {
    public HelloWorld() {
        Box b = Box.createVerticalBox();

        // Labels
        JLabel bold = new JLabel("I'm bold !");
        JLabel notBold = new JLabel("<html><em>I'm not bold !</em></html>");
        b.add(bold);
        b.add(notBold);

        // Scrollbars example
        JPanel scrollViewPort = new JPanel();
        scrollViewPort.setPreferredSize(new Dimension(400, 400));

        JScrollPane scroll = new JScrollPane(scrollViewPort);
        b.add(scroll);

        add(b, BorderLayout.CENTER);

        // Bold menu
        JMenuBar menubar = new JMenuBar();
        JMenu menu = new JMenu("Menu");
        JMenuItem item = new JMenuItem("Item");
        menu.add(item);
        menubar.add(menu);

        setJMenuBar(menubar);
        setPreferredSize(new Dimension(200, 200));
        pack();
    }

    public static void setNativeLAF() {
        // Native L&F
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            System.out.println("Unable to set native look and feel: " + e);
        }
    }

    public static void main(String[] args) {
        // setNativeLAF();

        HelloWorld app = new HelloWorld();
        app.setVisible(true);
    }
}

看到不同 :

原生 L&F (GTK+)

原生 L&F (GTK+)

与金属 L&F

与金属 L&F

通过注释掉setNativeLAF()通话。

当我的应用程序启动时,在任何窗口出现之前,我正在应用本机外观。这UIManager给了我GTK+ (com.sun.java.swing.plaf.gtk.GTKLookAndFeel)原生的外观和感觉,这没关系,因为我使用的是 Gnome 3 桌面。

我现在有三个问题:

  1. GTK+ 的外观和感觉不像 GTK 主题(请参阅滚动条)
  2. JMenuBar 似乎已禁用(Metal L&F 不是这种情况)
  3. 字体是粗体!(与金属 L&F 相同的问题,但可以修复)

任何有关 GTK+ L&F 为什么在我的系统上执行此操作的帮助或解释都将不胜感激。

编辑:这是 Eclipse 中我的系统上的“经典”应用程序的样子。

蚀

4

1 回答 1

3

我看到有几件事值得一提:

  1. 您可以将派生字体应用到标签,如下所示。

  2. 组件系统中HTML的相关规范“ EM基本强调通常以斜体字体呈现”。

  3. 另请参见初始线程

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class HelloWorld extends JFrame {

    public HelloWorld() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Box b = Box.createVerticalBox();

        // Labels
        JLabel bold = new JLabel("I'm bold !");
        bold.setFont(bold.getFont().deriveFont(Font.BOLD));
        JLabel notBold = new JLabel("<html><em>I'm not bold !</em></html>");
        b.add(bold);
        b.add(notBold);

        // Scrollbars example
        JPanel scrollViewPort = new JPanel();
        scrollViewPort.setPreferredSize(new Dimension(400, 200));
        JScrollPane scroll = new JScrollPane(scrollViewPort);
        b.add(scroll);
        add(b, BorderLayout.CENTER);

        // Bold menu
        JMenuBar menubar = new JMenuBar();
        JMenu menu = new JMenu("Menu");
        JMenuItem item = new JMenuItem("Item");
        menu.add(item);
        menubar.add(menu);
        setJMenuBar(menubar);

        pack();
        setLocationRelativeTo(null);
    }

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

            @Override
            public void run() {
                HelloWorld app = new HelloWorld();
                app.setVisible(true);
            }
        });
    }
}
于 2012-06-20T18:54:50.547 回答