如何使某个 JFrame 具有与其他 JFrame 不同的 LAF?

How can I make a certain JFrame have a different LAF from other JFrames?

假设我有 2 个 JFrame。将 JFrame 设置为可见后,如果不先将可见性设置为隐藏和正常,则似乎无法更改 LAF。这意味着闪烁,并且 JFrame 跳到顶部。

否则,你会得到这个:

(Metal 和 Ubuntu 系统 LAF 之间的某种混合)

另外,重绘好像也没什么用。

现在,假设第一个 JFrame 是使用 Metal LAF 制作的。显示后,LAF 变为系统LAF。然后第二个出现。现在,第一个被这件有趣的事情影响了。第二个没问题。为什么会这样?这是我的代码:

public static void main(String[] args) throws ClassNotFoundException, UnsupportedLookAndFeelException, InstantiationException, IllegalAccessException {
    JFrame first = new JFrame("First");
    first.add(new JButton("Click me, I look funny"));
    first.setPreferredSize(new Dimension(100, 100));
    first.pack();
    first.setVisible(true);

    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

    first.repaint();

    JFrame second = new JFrame("Second");
    second.add(new JButton("Click"));
    second.setPreferredSize(new Dimension(100, 100));
    second.pack();
    second.setVisible(true);
    second.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

那么如何让新的 LAF 只影响 1 个 JFrame?

或者 LAF 是全局的,不能仅应用于 1 个 JFrame?

在我看来,它们好像是在您创建 JFrame 时应用的,因此只需在创建下一个 JFrame 之前更改设置即可。

例如:

UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
JFrame first = new JFrame("First");
first.add(new JButton("Click me, I look funny"));
first.setPreferredSize(new Dimension(300, 100));
first.pack();
first.setVisible(true);

UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");

JFrame second = new JFrame("Second");
second.add(new JButton("Click"));
second.setPreferredSize(new Dimension(100, 100));
second.setLocation(300, 0);
second.pack();
second.setVisible(true);
second.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

出品: