Как я могу заставить определенный JFrame иметь LAF, отличный от других JFrame?

Допустим, у меня есть 2 JFrames. После установки видимого 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?


person Universal Electricity    schedule 18.10.2015    source источник
comment
Допустим, у меня есть 2 JFrames. См. Использование нескольких JFrames, хорошая/плохая практика?   -  person Andrew Thompson    schedule 18.10.2015


Ответы (1)


Мне кажется, что они применяются при создании JFrame, поэтому просто измените настройку перед созданием следующего JFrame.

eg:

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

Произведено:

введите здесь описание изображения

person WillShackleford    schedule 18.10.2015