Java-апплет на веб-странице не соответствует установленному внешнему виду - PullRequest
2 голосов
/ 20 февраля 2010

Я пытаюсь настроить внешний вид (LAF) апплета Java, который используется через веб-браузер. Я хочу установить системный LAF по умолчанию, но при загрузке в браузере апплет возвращается к Metal LAF. Когда я запускаю его как отдельный апплет, LAF применяется правильно. Единственный элемент, который я показываю пользователю - это JFileChooser. Я пробовал несколько способов преодолеть это, в том числе:

1) Переопределить метод start () апплета:

@Override
public void start() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.updateComponentTreeUI(this);
        System.out.println("LOOK AND FEEL SET!");
    }
    catch (Exception ex) {
        System.out.println(ex);
    }
}

2) Установите его в статическом инициализаторе класса апплета:

static {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        System.out.println("LOOK AND FEEL SET!");
    }
    catch (Exception ex) {
        System.out.println(ex);
    }
}

3) Установите его в конструкторе апплета:

public MyApplet() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.updateComponentTreeUI(this);
        System.out.println("LOOK AND FEEL SET!");
    }
    catch (Exception ex) {
        System.out.println(ex);
    }
}

Я использую Java 6, но ориентируюсь на Java 5 в Windows. В любом случае LOOK AND FEEL SET! выводится на консоль, так что я знаю, что она установила ее без исключения. Это происходит независимо от браузера (с использованием Firefox 3.6 и IE7). Почему он это делает и как я могу заставить его уважать LAF, который я назначаю?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2010

Итак, я попробовал ответ finnw и отметил, что он принят, не осознавая, что я также сделал некоторые другие модификации в своем коде. Когда я чистил код, я удалил свои моды и оставил finnw, но потом он снова сломался.

Это были изменения, которые сработали:

JFileChooser chooser = new JFileChooser();

try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    SwingUtilities.updateComponentTreeUI(chooser);
}
catch (Exception ex) {
    System.out.println(ex);
}

Итак, что я здесь сделал, так это установил внешний вид средства выбора файлов, вместо того, чтобы пытаться форсировать LAF для всего апплета. Это своего рода хак, но средство выбора файлов - единственная часть пользовательского интерфейса, которую пользователь все равно видит.

0 голосов
/ 22 февраля 2010

Кажется, есть одна неясная ошибка, которую когда-либо совершает практически каждый апплет. Swing (также компоненты AWT) используется из потока диспетчеризации событий AWT (EDT). Модель потоков апплета немного эксцентрична.

Это единственный раз, когда invokeAndWait следует использовать с этим крайним образцом:

@Override public void init() {
     try {
         java.awt.EventQueue.invokeAndWait(new Runnable() { public void run() {
             initEDT();
         }});
    } catch (java.lang.InterruptedException exc) {
         Thread.currentThread().interrupt();
    } catch (java.lang.reflect.InvocationTargetException exc) {
         throw new Error(exc.getCause());
    }
}
0 голосов
/ 20 февраля 2010

Я использовал этот код в недавно разработанном апплете:

public void init() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception ex) {
        // Just accept the default L&F
    }
    SwingUtilities.updateComponentTreeUI(this);
    super.init();

    // Now add components...
}

См. Также Внешний вид окна апплета изменяется на последующих экранах (Я не решил эту проблему, поскольку моему апплету не нужно было открывать всплывающие окна.)

...