gpt4 book ai didi

Java GTK+ 原生外观和感觉看起来很糟糕且大胆

转载 作者:行者123 更新时间:2023-11-29 05:58:27 25 4
gpt4 key购买 nike

我在将 native 外观应用到我的 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+)

with native L&F (GTK+)

使用金属 L&F

with Metal L&F

通过注释掉 setNativeLAF() 调用。

在我的应用程序启动时,在出现任何窗口之前,我正在应用 native 外观。 UIManager 为我提供了 GTK+ (com.sun.java.swing.plaf.gtk.GTKLookAndFeel) 作为 native 外观,这没问题,因为我使用的是Gnome 3 桌面。

我现在遇到三个问题:

  1. GTK+ 的外观和感觉不像 GTK 主题(见滚动条)
  2. JMenuBar 似乎已禁用(Metal L&F 并非如此)
  3. 字体是粗体! (与 Metal L&F 相同的问题,但可以修复)

对于 GTK+ L&F 为什么在我的系统上这样做的任何帮助或解释,我们将不胜感激。

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

eclipse

最佳答案

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

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

  2. 相关specification对于 HTML in a component sys "EM 基本强调通常以斜体呈现。

  3. 另见 Initial Threads

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

关于Java GTK+ 原生外观和感觉看起来很糟糕且大胆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11116386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com