Использование Spring в Java Swing приложении

Рейтинг: 1Ответов: 1Опубликовано: 09.08.2023

Помогите разобраться. Я изучаю Spring Framework и у меня не получается установить цвет фона backgroundColor и шрифт fontMenu через конфигурацию в XML. Spring контейнер правильно инициализируется и конфигурация бина загружается. Однако фон и шрифт не меняются, как я ожидал. Есть ли что-то, что я упустил или делаю не так? Как я могу правильно использовать Spring для установки цвета фона и шрифта в моем Java Swing приложении?

<bean id="gameMenuViewBean" class="org.example.game.view.GameMenuView">
        <property name="backgroundColor" value="#{T(java.awt.Color).GRAY}"/>
        <property name="fontMenu">
            <bean class="java.awt.Font">
                <constructor-arg value="Arial"/>
                <constructor-arg value="1"/> <!-- Font style: 0 = PLAIN, 1 = BOLD, 2 = ITALIC -->
                <constructor-arg value="24"/> <!-- Font size -->
            </bean>
        </property>
    </bean>
public class GameMenuView extends JFrame {

    private Color backgroundColor;
    private Font fontMenu;
    
    public void setBackgroundColor(Color backgroundColor) {
        this.backgroundColor = backgroundColor;
    }
    
    public void setFontMenu(Font fontMenu) {
        this.fontMenu = fontMenu;
    }

    // ... Остальной код
}
public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        
    SwingUtilities.invokeLater(() -> context.getBean("gameMenuViewBean", GameMenuView.class));
}

Ответы

▲ 0

Из кода предоставленного выше я могу сделать вывод что у вас не устанавливается цвет фона и шрифт так как вы не вызываете соответсвующие методы для установки этих параметров в коде , а именно вы не вызываете методы setBackground() и setFont() из объекта ContentPane. Попробуйте отредактировать код следующим образом

public class GameMenuView extends JFrame {

    private Color backgroundColor;
    private Font fontMenu;
     
    // Устанавливаем фон используя setBackground()    
    public void setBackgroundColor(Color backgroundColor) {
        getContentPane().setBackground(backgroundColor);
        this.backgroundColor = backgroundColor;
        

    }
    
    // Устанавливаем шрифт используя setFont()
    public void setFontMenu(Font fontMenu) {
        getContentPane().setFont(fontMenu);
        this.fontMenu = fontMenu;
    }

    // ... Остальной код
}


Я также настоятельно рекомендую использовать конструктор , так код выглядит лаконичнее. Теперь касательно xml я рекомендую вам вынести объекты Color и Font в отдельные бины , и далее внедрить их. Для этого можете использовать следующий код


<!-- Определение бина для Color -->
    <bean id="color" class="java.awt.Color">
        <constructor-arg>
            <util:constant static-field="java.awt.Color.BLUE"/>
        </constructor-arg>
    </bean>

    <!-- Определение бина для Font -->
    <bean id="font" class="java.awt.Font">
        <constructor-arg value="Arial"/>
        <constructor-arg value="1"/>
        <constructor-arg value="24"/>
    </bean>


<!-- Определение бина для GameMenuView с явным указанием зависимостей -->
    <bean id="gameMenuViewBean" class="org.example.game.view.GameMenuView">
        <constructor-arg ref="color"/>
        <constructor-arg ref="font"/>
    </bean>


Здесь мы создаем 2 бина по отдельности и далее внедряем их в бин класса GameMenuView через конструктор.

Java код представленный выше должен работать. Также я рекомендую вам перейти с Swing на JavaFx , он по моему мнению легче , и с ним конструировать UI приложения удобнее , особенно используя SceneBuilder. Также рассмотрите возможно конфигурации Spring используя Annotation Based Configuration. Надеюсь смог вам помочь.