Фон панели не изменяется менеджером пользовательского интерфейса - PullRequest
0 голосов
/ 28 апреля 2019

В моей программе я бы хотел, чтобы пользователь мог изменять цветовую схему программы.У меня есть метод, который передает цвет для установки фона всех панелей с помощью UIManager.

public void changeColourScheme(Color c) {
        UIManager.put("Panel.background", c);
        SwingUtilities.updateComponentTreeUI(this);
    }

Однако проблема, с которой я сталкиваюсь, заключается в том, что он не меняет цвет панелей.Этот метод находится в классе для JFrame.

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Скопировано непосредственно из Документация Swing API .

public static void updateComponentTreeUI (Компонент c)

Простое изменение внешнего вида: спросите каждый узел в дереве updateUI () - то есть инициализировать его свойство UI текущий внешний вид.

Обратите внимание на акцент. Ваш код не работает, потому что вы передаете this в качестве аргумента updateComponentTreeUI(). Так как вы передаете свою панель в качестве аргумента, только компоненты внутри панели и самой панели получат обновленный интерфейс. Вы должны передать контейнер, который содержит все другие панели в вашей программе, то есть ваш JFrame

public void changeColourScheme(Color c) {
   UIManager.put("Panel.background", c);
   SwingUtilities.updateComponentTreeUI(frame); //instace of your frame
}
0 голосов
/ 28 апреля 2019

просто потому, что изменения UIDefaults действительны только для вновь созданных компонентов

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

если вы сделаете это вручную, рекурсия очень поможет, как это

private static void loopForPanel(Container c, Color col) {
        synchronized (c.getTreeLock()) {
            for (Component com : c.getComponents()) {
                if (com instanceof JPanel) {
                    com.setBackground(col);
                }
                if (com instanceof Container) {
                    loopForPanel((Container) com,col);
                }
            }
        }
    }

затем в вашем методе changeColourScheme передайте саму рамку для метода loopForPanel нужного цвета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...