Java GTK +本机外观看起来很糟糕和大胆

时间:2012-06-20 09:18:28

标签: java swing gtk look-and-feel

我在应用原生Look& amp;时遇到问题感觉我的JFrame,所有文本(HTML格式的JLabel除外)都有一个丑陋的粗体字。

以下代码中非常简单的用户界面总结了我在这个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&amp; F(GTK +)

with native L&F (GTK+) http://img836.imageshack.us/img836/5725/gtklaf.png

使用Metal L&amp; F

with Metal L&F http://img215.imageshack.us/img215/6989/metallaf.png

通过评论setNativeLAF()来电。

我在应用程序启动时,在任何窗口出现之前应用原生外观。 UIManager给我GTK+ (com.sun.java.swing.plaf.gtk.GTKLookAndFeel)作为原生外观,这是好的,因为我使用的是Gnome 3桌面。

我现在有三个问题:

  1. GTK +外观与GTK主题不同(参见滚动条)
  2. JMenuBar似乎已禁用(与金属L&amp; F不同)
  3. 字体粗体! (与金属L&amp; F相同,但可修复)
  4. 任何帮助或解释为什么GTK + L&amp; F会在我的系统上做到这一点。

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

    eclipse

1 个答案:

答案 0 :(得分:3)

我看到一些值得一提的事情:

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

  2. specification sys“ EM 的相关HTML in a component基本重点通常以斜体字体”呈现。

  3. 另请参阅 Initial Threads

  4. enter image description here

    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);
                }
            });
        }
    }