LookAndFeel не меняется в Ubuntu - PullRequest
0 голосов
/ 17 апреля 2010

Кто-нибудь знает, почему laf не меняется в следующем коде? (работает в Ubuntu)

import java.awt.Dialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class TEST extends JPanel {

    public TEST() {
    final LookAndFeelInfo[] lafArray = UIManager.getInstalledLookAndFeels();
    String[] names = new String[lafArray.length];
    for (int i = 0; i < names.length; i++) {
        names[i] = lafArray[i].getName();
    }

    final JComboBox cb = new JComboBox(names);
    cb.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ev) {
        try {
            int index = cb.getSelectedIndex();
            LookAndFeelInfo lafInfo = lafArray[index];
            String lafClassName = lafInfo.getClassName();
            System.out.println(lafClassName);
            UIManager.setLookAndFeel(lafClassName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    });

    add(cb);
    }

    public static void main(String[] args) throws Exception {
    System.out.println("start");

    JDialog dialog = new JDialog(null, Dialog.ModalityType.APPLICATION_MODAL);
    dialog.setContentPane(new TEST());
    dialog.pack();
    dialog.setLocationRelativeTo(null);
    dialog.setVisible(true);
    dialog.dispose();

    System.out.println("end");
    }

}

Ответы [ 2 ]

4 голосов
/ 17 апреля 2010

После того, как вы позвоните UIManager.setLookAndFeel(lafClassName), позвоните SwingUtilities.updateComponentTreeUI(cb.getParent). В более полном приложении вы должны вызывать его на каждом контейнере верхнего уровня. Вы также должны вызвать pack() для Контейнера из-за разных размеров Компонентов между lafs.

2 голосов
/ 17 апреля 2010

Вы не должны изменять внешний вид после рендеринга компонента. Это должно быть сделано до инициализации компонента. С здесь :

Примечание: если вы собираетесь установить L & F, вы должны сделать это как самый первый шаг в вашем приложении. В противном случае вы рискуете инициализировать Java L & F независимо от того, какой L & F вы запрашивали. Это может произойти непреднамеренно, когда статическое поле ссылается на класс Swing, что приводит к загрузке L & F. Если L & F еще не указано, загружается L & F по умолчанию для JRE. Для JRE Sun по умолчанию используется Java L & F, для JRE Apple - Apple L & F и т. Д.

...