Jak uruchomic Content drugiej klasy

Jak uruchomic Content drugiej klasy
Mateusz Jarecki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Witam

Siedze dosyc krótko w JavaFX i o ile wiem jak to zrobic w JavaSwing to nie wiem jak to wykonac w FX. Chodzi o to ze w klasie main wyswietla mi sie okno do podania danych i po kliknieciu accept powinien odpalic sie kod z Classy Board.

Kopiuj
package sample;

        import javafx.application.Application;
        import javafx.application.Platform;
        import javafx.geometry.Insets;
        import javafx.scene.Parent;
        import javafx.scene.Scene;
        import javafx.scene.control.Button;
        import javafx.scene.control.Spinner;
        import javafx.scene.layout.GridPane;
        import javafx.scene.text.Text;
        import javafx.stage.Stage;



public class Main extends Application {


        private Scene scene;

        public static Stage primaryStage;

        Board board = new Board();
        public static int x;
        public static int y;

        private Parent createContent() {
            GridPane lobby = new GridPane();
            lobby.setHgap(2);
            lobby.setVgap(2);
            lobby.setPadding(new Insets(10, 20, 10, 20));

            Text row = new Text("Row");
            lobby.add(row, 0, 0);

            Text column = new Text("Column");
            lobby.add(column, 0, 1);

            Spinner rowspinner = new Spinner(10, 100, 1);
            lobby.add(rowspinner, 1, 0);

            Spinner columnspinner = new Spinner(10, 100, 1);
            lobby.add(columnspinner, 1, 1);

            Button accept = new Button("Accept");
            lobby.add(accept, 1, 2);

            accept.setOnAction(__ ->
            {
                x = (int)rowspinner.getValue();
                y = (int)columnspinner.getValue();
                try {
                    board.start(Board.boardStage);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("jestem tu");
            });

            return lobby;
        }



        public  void restart(Stage x){

            Platform.runLater( () -> {
                try {
                    new Main().start(new Stage());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }

        @Override
        public void start(Stage stage) throws Exception {
            primaryStage = stage;
            scene = new Scene(createContent());

            stage.setScene(scene);
            stage.show();


        }


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

Class Board

Kopiuj
package sample;

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.List;

public class Board {



        private static final int TILE_SIZE = 40;
        public static final int W = Main.x * TILE_SIZE;
        private static final int H = Main.y * TILE_SIZE;

        private static final int X_TILES = W / TILE_SIZE;
        private static final int Y_TILES = H / TILE_SIZE;

        private Tile[][] grid = new Tile[X_TILES][Y_TILES];
        private Scene scene;

        public static Stage boardStage;
    //Main main = new Main();

        public Parent createContent() {
            Pane root = new Pane();
            root.setPrefSize(W, H);

            for (int y = 0; y < Y_TILES; y++) {
                for (int x = 0; x < X_TILES; x++) {
                    Tile tile = new Tile(x, y, Math.random() < 0.1);

                    grid[x][y] = tile;
                    root.getChildren().add(tile);
                }
            }

            for (int y = 0; y < Y_TILES; y++) {
                for (int x = 0; x < X_TILES; x++) {
                    Tile tile = grid[x][y];

                    if (tile.hasBomb)
                        continue;

                    long bombs = getNeighbors(tile).stream().filter(t -> t.hasBomb).count();

                    if (bombs > 0)
                        tile.text.setText(String.valueOf(bombs));
                }
            }

            return root;
        }

        private List<Tile> getNeighbors(Tile tile) {
            List<Tile> neighbors = new ArrayList<>();


            int[] points = new int[] {
                    -1, -1,
                    -1, 0,
                    -1, 1,
                    0, -1,
                    0, 1,
                    1, -1,
                    1, 0,
                    1, 1
            };

            for (int i = 0; i < points.length; i++) {
                int dx = points[i];
                int dy = points[++i];

                int newX = tile.x + dx;
                int newY = tile.y + dy;

                if (newX >= 0 && newX < X_TILES
                        && newY >= 0 && newY < Y_TILES) {
                    neighbors.add(grid[newX][newY]);
                }
            }

            return neighbors;
        }

        private class Tile extends StackPane {
            private int x, y;
            private boolean hasBomb;
            private boolean isOpen = false;

            private Rectangle border = new Rectangle(TILE_SIZE - 2, TILE_SIZE - 2);
            private Text text = new Text();

            public Tile(int x, int y, boolean hasBomb) {
                this.x = x;
                this.y = y;
                this.hasBomb = hasBomb;

                border.setStroke(Color.LIGHTGRAY);

                text.setFont(Font.font(18));
                text.setText(hasBomb ? "X" : "");
                text.setVisible(false);

                getChildren().addAll(border, text);

                setTranslateX(x * TILE_SIZE);
                setTranslateY(y * TILE_SIZE);

                setOnMouseClicked(e -> open());
            }

            public void open() {
                if (isOpen)
                    return;

                if (hasBomb) {
                    System.out.println("Game Over");
                    //main.restart(boardStage);
                    return;
                }

                isOpen = true;
                text.setVisible(true);
                border.setFill(null);

                if (text.getText().isEmpty()) {
                    getNeighbors(this).forEach(Tile::open);
                }
            }
        }
    public void start(Stage stage) throws Exception {
        boardStage = stage;
        scene = new Scene(createContent());

        stage.setScene(scene);
        stage.show();


    }

}

nowyworek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: świat
  • Postów: 174
0

Powiem tak:
No nie chce mi sie tego czytac. Daj mniej, albo daj jeszcze mniej.

Pozdrawiam

Mateusz Jarecki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Co do zasady wywolanie classy jest tutaj

Kopiuj
accept.setOnAction(__ ->
            {
                x = (int)rowspinner.getValue();
                y = (int)columnspinner.getValue();
                try {
                    board.start(Board.boardStage);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("jestem tu");
            });

            return lobby;
        }

natomiast jesli chodzi o sama classe to zwraca ona obiekt typu Pane, a przynajmniej powinna, probowalem uzyc metody restart

Kopiuj
public  void restart(Stage x){

            Platform.runLater( () -> {
                try {
                    new Main().start(new Stage());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }

ustawiajac za Stage x zwrocony obiekt tylko obiekt jest klasy parent a wymagany jest jako Stage, jesli zmienie Stage na Parent to mio dostarczenia innych danych bedzie otwieralo sie okno w pierwszej classy a nie drugiej.

MrMadMatt
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 373
0

Wydaje mi się że ten twój button accept powinien być polem klasy a nie zmienną lokalną która ginie po zakończeniu metody.

Mateusz Jarecki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0

Znaczy zmieni to na pewno tyle ze bedzie istnial poza klasa, ale nadal zostaje problem z wyswietleniem drugiej classy przez np przez dostarczenie innego typu obiektu niz wymagany

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
3

Ja myśle że musisz zacząć od podstaw i zrozumieć czym różni się KLASA od OBIEKTU, bo inaczej to nic z tego nie będzie.

Mateusz Jarecki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0
Shalom napisał(a):

Ja myśle że musisz zacząć od podstaw i zrozumieć czym różni się KLASA od OBIEKTU, bo inaczej to nic z tego nie będzie.

Znam roznice, ale nadal nie zmienia to faktu z problemem zmiany sceny z pierwszej na druga. Moze w wczesniejszych wypowiedziach omylnie uzywalem slow klasa i object wiec rozumiem skad mogl sie wziac ten komentarz, aczkolwiek roznice znam ale nie pomaga mi to w zmianie sceny czytaj moim problemie. W swingu bez problemu tworzylem nowe okna, ale w FX mam z tym duzy problem zeby to wykonac wiec jesli efentualnie masz jakis popradnik co do obslugi scen i Stageow oraz ich zamiany to byl bym wdzieczny za ich podrzucenie

CS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 296
0

Zmieniaj tylko sceny, a nie twórz nowych obiektów aplikacji:

Kopiuj
@Override
    public void start(Stage primaryStage) throws Exception{

        HBox panel = new HBox();
        panel.setPadding(new Insets(10));
        panel.setAlignment(Pos.TOP_CENTER);
        panel.setBackground(new Background(new BackgroundFill(
                Color.AQUAMARINE,
                new CornerRadii(15),
                new Insets(5))));
        Scene panelScene = new Scene(panel, 300,275);
        Button btn1 = new Button("Switch to board");
        panel.getChildren().add(btn1);

        VBox board = new VBox();
        board.setAlignment(Pos.CENTER);
        Scene boardScene = new Scene(board, 400, 375);
        Button btn2 = new Button("Switch to panel");
        board.getChildren().add(btn2);

        btn1.setOnAction(event -> primaryStage.setScene(boardScene));
        btn2.setOnAction(event -> primaryStage.setScene(panelScene));

        primaryStage.setTitle("Switch scene demo");
        primaryStage.setScene(panelScene);
        primaryStage.show();
    }
Mateusz Jarecki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 11
0
cs napisał(a):

Zmieniaj tylko sceny, a nie twórz nowych obiektów aplikacji:

Kopiuj
@Override
    public void start(Stage primaryStage) throws Exception{

        HBox panel = new HBox();
        panel.setPadding(new Insets(10));
        panel.setAlignment(Pos.TOP_CENTER);
        panel.setBackground(new Background(new BackgroundFill(
                Color.AQUAMARINE,
                new CornerRadii(15),
                new Insets(5))));
        Scene panelScene = new Scene(panel, 300,275);
        Button btn1 = new Button("Switch to board");
        panel.getChildren().add(btn1);

        VBox board = new VBox();
        board.setAlignment(Pos.CENTER);
        Scene boardScene = new Scene(board, 400, 375);
        Button btn2 = new Button("Switch to panel");
        board.getChildren().add(btn2);

        btn1.setOnAction(event -> primaryStage.setScene(boardScene));
        btn2.setOnAction(event -> primaryStage.setScene(panelScene));

        primaryStage.setTitle("Switch scene demo");
        primaryStage.setScene(panelScene);
        primaryStage.show();
    }

Nie jestem pewny czy chodzi o cos takiego?

Kopiuj
accept.setOnAction(__ ->
            {
                scene = board.createContent(primaryStage);
                primaryStage.setScene(scene);
                restart(primaryStage);
                System.out.println("jestem tu");
            });

tutaj restart

Kopiuj
public  void restart(Stage x){

            Platform.runLater( () -> {
                try {
                    new Main().start(x);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }

a jesli chodzi o
createContent w Board to zmienilem Parent na Scene i zwracam Scen

Kopiuj
 System.out.println("jestem w board");
            scene1 = new Scene(root);
            /*
            primaryStage.setScene(scene1);
            primaryStage.show();
             */
            return scene1;

Wiem ze na pewno wchodzi do srodka i ze scene = board.createContent(primaryStage); nie jest null, ale nie mam jeszcze oczekiwanego efektu zamiany scenn

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.