java swing spring-boot

java - Cómo configurar el arranque de primavera con la aplicación swing



spring-boot (3)

Ha pasado un tiempo desde que publicaste la pregunta, pero me he quedado con el mismo problema en un proyecto antiguo que estoy migrando y he pensado de otra manera, creo que más claro, para que las cosas funcionen.

En lugar de usar SpringApplication.run(Application.class, args); puede usar: el new SpringApplicationBuilder(Main.class).headless(false).run(args); y no es necesario hacer que la clase de aplicación de juguete se extienda desde JFrame. Por lo tanto el código podría verse como:

@Configuration @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { ConfigurableApplicationContext context = new SpringApplicationBuilder(Application.class).headless(false).run(args); AppPrincipalFrame appFrame = context.getBean(AppPrincipalFrame.class); }

Me gustaría usar las características spring-boot-starter-data-jpa para crear una aplicación no web. En la documentación 52.4 dice:

El código de aplicación que desea ejecutar como su lógica de negocios puede implementarse como CommandLineRunner y colocarse en el contexto como una definición de @Bean.

Mi AppPrincipalFrame se parece a:

@Component public class AppPrincipalFrame extends JFrame implements CommandLineRunner{ private JPanel contentPane; @Override public void run(String... arg0) throws Exception { EventQueue.invokeLater(new Runnable() { public void run() { try { AppPrincipalFrame frame = new AppPrincipalFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }

Y la clase de aplicación de arranque se ve así:

@Configuration @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(Application.class, args); AppPrincipalFrame appFrame = context.getBean(AppPrincipalFrame.class); } }

Pero no funciona. ¿Alguien tiene una muestra sobre esto?

Editado y excepción añadida.

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''appPrincipalFrame''. Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [es.adama.swing.ui.AppPrincipalFrame]: Constructor threw exception; nested exception is java.awt.HeadlessException

Saludos.


La aplicación Swing debe colocarse en la cola de eventos Swing. No hacerlo es un grave error.

Así que la forma correcta de hacerlo:

public static void main(String[] args) { ConfigurableApplicationContext ctx = new SpringApplicationBuilder(SwingApp.class) .headless(false).run(args); EventQueue.invokeLater(() -> { SwingApp ex = ctx.getBean(SwingApp.class); ex.setVisible(true); }); }

Además, solo podemos usar la anotación @SpringBootApplication .

@SpringBootApplication public class SwingApp extends JFrame {

Vea mi tutorial de integración de Spring Boot Swing para un ejemplo completo de trabajo.


Otra solución simple y elegante es deshabilitar la propiedad sin cabeza como se muestra here. Sin embargo, tendrá que hacerlo, justo antes de crear / mostrar el JFrame.

System.setProperty("java.awt.headless", "false"); //Disables headless

Entonces, lo que funcionó para mí:

SpringApplication.run(MyClass.class, args); System.setProperty("java.awt.headless", "false"); SwingUtilities.invokeLater(() -> { JFrame f = new JFrame("myframe"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); });

Anotaciones en MyClass.class (no sé si desempeñan algún papel):

@SpringBootApplication @EnableWebMvc