Переключение между двумя экземплярами MetalLookAndFeel - PullRequest
0 голосов
/ 28 июня 2018

Можно ли иметь два разных экземпляра MetalLookAndFeel и переключаться между ними во время выполнения? Я разрабатываю движок тем для IDE под названием MARS (MIPS Assembly IDE), и мне либо нужен пользовательский внешний вид, который позволит мне манипулировать цветами каждого компонента, либо я буду использовать значение по умолчанию MetalLookAndFeel с UIManager изменить цвета.

Я посмотрел на собственную реализацию Java LookAndFeel, но не понял, как я мог это сделать. Там нет учебников, чтобы следовать, если кто-то хочет написать CustomLookAndFeel, поэтому я придумал решение, подобное этому.

Возможно ли иметь два экземпляра MetalLookAndFeel, один с измененными цветами и один по умолчанию, и переключаться между ними во время выполнения? Если нет, что можно сделать, чтобы выполнить то, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 28 июня 2018

Будучи идиотом и не понимая, как на самом деле работает наследование, возникают некоторые проблемы ... Решение простое. Подкласс MetalLookAndFeel и используйте UIManager.setLookAndFeel(String className) для переключения между исходным MetalLookAndFeel и подклассом CustomLookAndFeel.

Подкласс CustomLookAndFeel:

import javax.swing.plaf.metal.MetalLookAndFeel;

public class CustomMetalLookAndFeel extends MetalLookAndFeel {

    private static final long serialVersionUID = -5415261270648192921L;
}

Main Method (Нужно InvokeLater и тому подобное, но мне лень):

public static void main(String[] args) {
    UIManager.installLookAndFeel("CustomMetal", "laf.CustomMetalLookAndFeel");
    try {
        UIManager.setLookAndFeel("laf.CustomMetalLookAndFeel");
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e1) {
        e1.printStackTrace();
    }
    UIManager.getLookAndFeelDefaults().put("Panel.background", new ColorUIResource(Color.RED));

    JFrame f = new JFrame();
    JPanel p = new JPanel();
    JButton j = new JButton("100000");
    j.addActionListener(e -> {
        try {
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e1) {
            e1.printStackTrace();
        }
        SwingUtilities.updateComponentTreeUI(f);
    });
    p.add(j);
    f.add(p);
    f.pack();
    f.setVisible(true);
}
...