فهرست منبع

Implemented base for observer pattern

Ondřej Schlaichert 8 ماه پیش
والد
کامیت
938534cdc2

+ 1 - 1
pom.xml

@@ -60,7 +60,7 @@
                         <!-- Default configuration for running with: mvn clean javafx:run -->
                         <id>default-cli</id>
                         <configuration>
-                            <mainClass>eu.oschl.schmorngui/eu.oschl.gui.Session</mainClass>
+                            <mainClass>eu.oschl.schmorn.Main</mainClass>
                             <launcher>app</launcher>
                             <jlinkZipName>app</jlinkZipName>
                             <jlinkImageName>app</jlinkImageName>

+ 4 - 0
src/main/java/eu/oschl/gui/ActionProcessor.java

@@ -0,0 +1,4 @@
+package eu.oschl.gui;
+
+public class ActionProcessor extends Observable {
+}

+ 13 - 4
src/main/java/eu/oschl/gui/GameController.java

@@ -1,14 +1,23 @@
 package eu.oschl.gui;
 
+import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
-import javafx.scene.control.Label;
+import javafx.scene.text.Text;
+import javafx.scene.text.TextFlow;
 
 public class GameController {
     @FXML
-    private Label welcomeText;
+    private TextFlow output;
 
     @FXML
-    protected void onHelloButtonClick() {
-        welcomeText.setText("Welcome to JavaFX Application!");
+    private void onTestButtonClick(ActionEvent actionEvent) {
+
+        for (int i = 0; i < 50; i++) {
+            Text fragment1 = new Text("Hello, ");
+            Text fragment2 = new Text("favourite boy! ");
+            Text fragment3 = new Text("Welcome back. ");
+
+            output.getChildren().addAll(fragment1, fragment2, fragment3);
+        }
     }
 }

+ 18 - 0
src/main/java/eu/oschl/gui/Observable.java

@@ -0,0 +1,18 @@
+package eu.oschl.gui;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public abstract class Observable {
+    protected Set<Observer> observers = new HashSet<>();
+
+    public void register(Observer observer) {
+        observers.add(observer);
+    }
+
+    public void sendEvent() {
+        for (Observer observer : observers) {
+            observer.update();
+        }
+    }
+}

+ 5 - 0
src/main/java/eu/oschl/gui/Observer.java

@@ -0,0 +1,5 @@
+package eu.oschl.gui;
+
+public interface Observer {
+    void update();
+}

+ 5 - 1
src/main/java/eu/oschl/gui/Session.java

@@ -1,5 +1,6 @@
 package eu.oschl.gui;
 
+import eu.oschl.textadventure.Game;
 import javafx.application.Application;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Scene;
@@ -8,8 +9,11 @@ import javafx.stage.Stage;
 import java.io.IOException;
 
 public class Session extends Application {
-    public static void launchGui(String[] args)
+    private static Game game;
+
+    public static void launchGui(Game game, String[] args)
     {
+        Session.game = game;
         Application.launch(Session.class, args);
     }
 

+ 9 - 6
src/main/java/eu/oschl/schmorn/Main.java

@@ -1,5 +1,7 @@
 package eu.oschl.schmorn;
 
+import eu.oschl.textadventure.Game;
+
 /**
  * Serves as an entry point, handles starting either CLI or GUI version of the game.
  *
@@ -9,20 +11,21 @@ class Main {
     static void main(String[] args) {
         var useCli = args.length > 0 && args[0].equalsIgnoreCase("--cli");
 
+        var game = Setup.createGame();
+
         if (useCli) {
-            startCli();
+            startCli(game);
         } else {
-            startGui(args);
+            startGui(game, args);
         }
     }
 
-    private static void startCli() {
-        var game = Setup.createGame();
+    private static void startCli(Game game) {
         var session = new eu.oschl.cli.Session(game);
         session.start();
     }
 
-    private static void startGui(String[] args) {
-        eu.oschl.gui.Session.launchGui(args);
+    private static void startGui(Game game, String[] args) {
+        eu.oschl.gui.Session.launchGui(game, args);
     }
 }

+ 37 - 28
src/main/resources/eu/oschl/gui/game.fxml

@@ -1,38 +1,47 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
+<?import javafx.geometry.Insets?>
 <?import javafx.scene.control.Button?>
 <?import javafx.scene.control.ScrollPane?>
-<?import javafx.scene.image.ImageView?>
 <?import javafx.scene.layout.ColumnConstraints?>
 <?import javafx.scene.layout.GridPane?>
 <?import javafx.scene.layout.RowConstraints?>
 <?import javafx.scene.layout.VBox?>
 <?import javafx.scene.text.TextFlow?>
 
-<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/25">
-  <columnConstraints>
-    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
-  </columnConstraints>
-  <rowConstraints>
-    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
-    <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
-      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
-  </rowConstraints>
-   <children>
-      <ScrollPane>
-         <content>
-            <TextFlow />
-         </content>
-      </ScrollPane>
-      <ImageView fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" />
-      <ScrollPane fitToWidth="true" GridPane.rowIndex="2">
-         <content>
-            <VBox>
-               <children>
-                  <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button" />
-               </children>
-            </VBox>
-         </content>
-      </ScrollPane>
-   </children>
-</GridPane>
+<GridPane fx:controller="eu.oschl.gui.GameController"
+          xmlns:fx="http://javafx.com/fxml/1"
+          xmlns="http://javafx.com/javafx/25">
+
+    <columnConstraints>
+        <ColumnConstraints hgrow="ALWAYS"/>
+    </columnConstraints>
+
+    <rowConstraints>
+        <RowConstraints minHeight="10.0" vgrow="ALWAYS" percentHeight="75.0" />
+        <RowConstraints minHeight="10.0" vgrow="ALWAYS" percentHeight="25.0" />
+    </rowConstraints>
+
+    <ScrollPane fitToWidth="true" hbarPolicy="NEVER">
+        <TextFlow fx:id="output">
+            <padding>
+                <Insets top="10.0" right="10.0" bottom="10.0" left="10.0"/>
+            </padding>
+        </TextFlow>
+    </ScrollPane>
+
+    <ScrollPane fitToWidth="true" GridPane.rowIndex="1">
+        <VBox spacing="5.0">
+
+            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 1" onAction="#onTestButtonClick"/>
+            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 2" onAction="#onTestButtonClick"/>
+            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 3" onAction="#onTestButtonClick"/>
+            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 4" onAction="#onTestButtonClick"/>
+            <Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Button 5" onAction="#onTestButtonClick"/>
+
+            <padding>
+                <Insets top="10.0" right="10.0" bottom="10.0" left="10.0"/>
+            </padding>
+        </VBox>
+    </ScrollPane>
+</GridPane>

+ 0 - 16
src/main/resources/eu/oschl/gui/hello-view.fxml

@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.VBox?>
-
-<?import javafx.scene.control.Button?>
-<VBox alignment="CENTER" spacing="20.0" xmlns:fx="http://javafx.com/fxml"
-      fx:controller="eu.oschl.gui.GameController">
-    <padding>
-        <Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
-    </padding>
-
-    <Label fx:id="welcomeText"/>
-    <Button text="Hello!" onAction="#onHelloButtonClick"/>
-</VBox>