Добавление таблиц стилей CSS в приложение JavaFX / Spring с помощью Stage Manager - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь добавить таблицы стилей CSS в свое приложение.Я использую scenebuilder, и когда я подключаю таблицу стилей к scenebuilder, она отображается нормально.Однако когда я запускаю свою программу, стилизация отсутствует.Я использую менеджер этапов для переключения этапов.Я действительно не уверен, где загрузить CSS в моем приложении.Таблица стилей CSS уже подключена в моих файлах FXML.Когда я пытаюсь загрузить CSS в свой менеджер этапов (используя scene.getStylesheets (). Add (getClass (). GetResource ("../../ java / MainCSS.css"). ToExternalForm ());) -, Я получаю исключение нулевого указателя.

Макет проекта: Рис макета Макет проекта: Рис макета pt 2

ЭтапМенеджер

  package project_3368.project_3368.view;

import javafx.application.Platform;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.slf4j.Logger;

import java.util.Objects;

import static org.slf4j.LoggerFactory.getLogger;

public class StageManager {
    private static final Logger LOG = getLogger(StageManager.class);
    private final Stage primaryStage;
    private final SpringFXMLLoader springFXMLLoader;


    public StageManager(SpringFXMLLoader springFXMLLoader, Stage stage){
        this.springFXMLLoader = springFXMLLoader;
        this.primaryStage = stage;
    }

    public void switchScene(final FxmlView view){
        Parent viewRootNodeHierarchy = loadViewNodeHierarchy(view.getFxmlFile());
        show(viewRootNodeHierarchy, view.getTitle());
    }

    private void show(final Parent rootnode, String title){
        Scene scene = prepareScene(rootnode);
        scene.getStylesheets().add(getClass().getResource("../../java/MainCSS.css").toExternalForm());
        primaryStage.setTitle(title);
        primaryStage.setScene(scene);
        primaryStage.sizeToScene();
        primaryStage.centerOnScreen();


        try{
            primaryStage.show();
        }catch (Exception exception){
            logAndExit("Unable to show scene for title" + title, exception);
        }
    }

    private Scene prepareScene(Parent rootnode){
        Scene scene = primaryStage.getScene();
        if(scene == null){
            scene = new Scene(rootnode);
        }
        scene.setRoot(rootnode);
        return scene;

    }

    private Parent loadViewNodeHierarchy(String fxmlFilePath){
        Parent rootNode = null;
        try{
            rootNode  = springFXMLLoader.load(fxmlFilePath);
            Objects.requireNonNull(rootNode, "A root FXML node must not be null");

        }catch (Exception exception){
            logAndExit("Unable to load FXML view" + fxmlFilePath, exception);
        }
        return rootNode;
    }

    private void logAndExit(String errorMsg, Exception exception){
        LOG.error(errorMsg, exception, exception.getCause());
        Platform.exit();
    }
}

Spring FXML Loader

package project_3368.project_3368.view;

import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.ResourceBundle;

@Component
public class SpringFXMLLoader {
    private final ResourceBundle resourceBundle;
    private final ApplicationContext context;

    @Autowired
    public SpringFXMLLoader(ApplicationContext context, ResourceBundle resourceBundle){
        this.resourceBundle = resourceBundle;
        this.context = context;
    }

    public Parent load(String fxmlPath) throws IOException {
        FXMLLoader loader = new FXMLLoader();
        loader.setControllerFactory(context::getBean);
        loader.setResources(resourceBundle);
        loader.setLocation(getClass().getResource(fxmlPath));
        return loader.load();
    }
}

Project3368Применение

package project_3368.project_3368;

import javafx.application.Application;
import javafx.stage.Stage;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import project_3368.project_3368.view.FxmlView;
import project_3368.project_3368.view.StageManager;


@SpringBootApplication
public class Project3368Application extends Application {

    protected ConfigurableApplicationContext springContext;
    protected StageManager stageManager;

    public static void main(final String[] args) {
        Application.launch(args);
    }

    @Override
    public void init() throws Exception {
        springContext = springBootApplicationContext();

    }

    @Override
    public void start(Stage stage) throws Exception {
        stageManager = springContext.getBean(StageManager.class, stage);
        displayInitialScene();


    }
    @Override
    public void stop() throws Exception{
        springContext.close();
    }


    protected void displayInitialScene(){stageManager.switchScene(FxmlView.CUSTOMER);}


    private ConfigurableApplicationContext springBootApplicationContext() {
        SpringApplicationBuilder builder = new SpringApplicationBuilder(Project3368Application.class);
        String[] args = getParameters().getRaw().stream().toArray(String[]::new);
        builder.headless(false);
        return builder.run(args);
    }
}

MainCSS.css

   .anchor {
    -fx-background-image:url('Red.jpg');
    -fx-background-size: cover;
    -fx-background-repeat: no-repeat;

}

.button{
    -fx-background-color:#FFFFFF;
    -fx-opacity: 1;
    -fx-text-fill: black;
}

.button:hover{
    -fx-background-color: #bcbcbc ;
}

.label{
    -fx-text-fill: black;
    -fx-font-size: 15;
    -fx-font-weight: bold;
    -fx-background-color: white;
}

.table-view .column-header .label {
    -fx-text-fill: black;
    -fx-font-weight: bold;
    -fx-font-size: 12;
}
.table-view .column-header{
    -fx-background-color: black;
    -fx-opacity: 0.7;
}

.table-view{
    -fx-opacity: 0.8;
}
.text-field{
    -fx-opacity: 0.7;
}

kanban.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="400.0" prefWidth="800.0" styleClass="anchor" stylesheets="@../../java/MainCSS.css" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="project_3368.project_3368.Controllers.KanbanController">
   <children>
      <ListView fx:id="ProductionList" layoutX="387.0" layoutY="81.0" onDragDetected="#dragProductionDetected" onDragDone="#DragDoneOnProduction" onDragDropped="#dragDroppedOnTarget" onDragOver="#dragOverTarget" prefHeight="274.0" prefWidth="200.0" />
      <ListView fx:id="PreproductionList" layoutX="190.0" layoutY="81.0" onDragDetected="#dragSourceDetected" onDragDone="#DragDoneOnSource" prefHeight="274.0" prefWidth="200.0" />
      <Label layoutX="190.0" layoutY="59.0" prefHeight="21.0" prefWidth="200.0" text="         Pre-Production" textAlignment="CENTER">
         <font>
            <Font name="Calibri" size="12.0" />
         </font></Label>
      <Label layoutX="387.0" layoutY="59.0" prefHeight="21.0" prefWidth="200.0" text="              Production" textAlignment="CENTER" />
      <ListView fx:id="PostProductionList" layoutX="586.0" layoutY="81.0" onDragDropped="#dragDroppedOnPostProduction" onDragOver="#dragOverPostProduction" prefHeight="274.0" prefWidth="184.0" />
      <Label layoutX="586.0" layoutY="59.0" prefHeight="21.0" prefWidth="184.0" text="       Post-Production" textAlignment="CENTER" />
      <Button fx:id="archiveButton" layoutX="714.0" layoutY="358.0" mnemonicParsing="false" onAction="#archiveButtonPushed" text="Archive" />
      <Button fx:id="newJobButton" layoutX="29.0" layoutY="51.0" mnemonicParsing="false" onAction="#newJobButtonPressed" prefHeight="42.0" prefWidth="110.0" text="New Job" />
      <Button fx:id="QuoteButton" layoutX="29.0" layoutY="121.0" mnemonicParsing="false" onAction="#QuoteButtonPushed" prefHeight="42.0" prefWidth="110.0" text="Quote" />
      <Button fx:id="salesReportButton" layoutX="29.0" layoutY="316.0" mnemonicParsing="false" onAction="#salesReportButtonPushed" prefHeight="42.0" prefWidth="110.0" text="Sales Report" />
      <Button fx:id="employeeButton" layoutX="29.0" layoutY="253.0" mnemonicParsing="false" onAction="#employeeButtonPushed" prefHeight="49.0" prefWidth="110.0" text="Employee" />
      <Button fx:id="customerButton" layoutX="29.0" layoutY="184.0" mnemonicParsing="false" onAction="#customerButtonPushed" prefHeight="49.0" prefWidth="110.0" text="Customer" />
      <Button fx:id="logoutButton" layoutX="716.0" layoutY="14.0" mnemonicParsing="false" onAction="#logoutButtonPushed" text="Logout" />
   </children>
</AnchorPane>

Ошибка

Исключениев методе запуска приложения 2018-12-03 13: 18: 02.370 ИНФОРМАЦИЯ 19816 --- [поток связи] j.LocalContainerEntityManagerFactoryBean: Закрытие JPA EntityManagerFactory для единицы сохраняемости по умолчанию 2018-12-03 13: 18: 02.373 ИНФОРМАЦИЯ 19816 -- [Поток связи] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Выключение начато ... 2018-12-03 13: 18: 02.379 INFO 19816 --- [Поток связи] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - завершение работы завершено.java.lang.reflect.InvocationTargetException в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (родной метод) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invol.jav)./jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.base / java.lang.reflect.Method.invoke (Method.java:564) в javafx.graphics/com.sun.LauncherImpl.launchApplicationWithArgs (LauncherImpl.java:473) при javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (РоднойМетод) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMab) ja.lang.reflect.Method.invoke (Method.java:564) в java.base / sun.launcher.LauncherHelper $ FXHelper.main (LauncherHelper.java:941) Причина: java.lang.RuntimeException: исключение в методе запуска приложения в javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:973) в javafx.graphics / com.sun.javafx.application.LauncherImpl.lambda $ launchApplication $ 2 (LauncherImpl.java:198) в java.base / java.lang.Thread.run (Thread.java:844) Вызывается: java.lang.NullPointerExceptionна project_3368.project_3368.view.StageManager.prepareScene (StageManager.java:47) на project_3368.project_3368.view.StageManager.show (StageManager.java:30) на project_3368.project_3368.view.StageManager.switgeSan (StageManager.switgeScene)) в project_3368.project_3368.Project3368Application.displayInitialScene (Project3368Application.java:41) в project_3368.project_3368.Project3368Application.start (Project3368Application.java:31) в javafx.graphics/com.sun.jmpla.Application.app.exe.(LauncherImpl.java:919) в javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda $ runAndWait $ 11 (PlatformImpl.java:449) в javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418) в java.base / java.security.AccessController.doPrivileged (собственный метод) по адресу javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417) вjavafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) в javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) в javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175) ... еще 1 Исключение при запуске приложения project_3368.project_3368.Project3368Application

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