-1

I have tried without a class using a local variable same problem.

A gui should open up and I can submit the number of cards I want and will randomly select from a deck. and other buttons on gui also

public class MainGUI extends Application {

    public void start(Stage primaryStage) {

        class deck {
            public ArrayList <Integer> Deck;



            public ArrayList<Integer> shuffleDeck(ArrayList<Integer> Deck) { 
                int x = 52;
                for (int i = 1; i <= x; ++i ) {
                Deck.add(i);
                }
                Collections.shuffle(Deck);
                return Deck;

        }

            public  ArrayList<Integer> randomCardsSelector(int x, ArrayList<Integer> Deck){
                ArrayList<Integer> selectedCards = new ArrayList<Integer>();
                Random rand = new Random();
                for(int i = 1; i <= x; ++i) {
                    int newElement = rand.nextInt(Deck.size());
                    selectedCards.add(Deck.get(newElement));
                    Deck.remove(newElement);
                    }
                return selectedCards;
            }

        }



        //Horizontal box containing Label, TextField, Button, Cards drawn
        HBox topContainer = new HBox();
        topContainer.setSpacing(10);
        topContainer.setPadding(new Insets(25,50,25,50));

        //This is the label
        Label insertNbr = new Label();
        insertNbr.setText("Number of cards:");
        insertNbr.setPadding(new Insets(5,5,5,5));

        //This the TextField
        TextField cardNbr = new TextField();
        cardNbr.setPadding(new Insets(5,5,5,5));
        cardNbr.setPrefWidth(30);

        //This is the submit button
        Button submitBtn = new Button();
        submitBtn.setPadding(new Insets(5,5,5,5));
        submitBtn.setText("Submit");

        HBox newBox = new HBox();
        //This is the fetch button
        Button fetchBtn = new Button();
        fetchBtn.setPadding(new Insets(5,5,5,5));
        fetchBtn.setText("Fetch");
        fetchBtn.setDisable(true);

        //This is the button to draw a card from the array
        Button drawCardBtn = new Button("Get Card");
        drawCardBtn.setPadding(new Insets(5,5,5,5));

        Button higherBtn = new Button();
        higherBtn.setPadding(new Insets(5,5,5,5));
        higherBtn.setText("Higher");

        Button lowerBtn = new Button();
        lowerBtn.setPadding(new Insets(5,5,5,5));
        lowerBtn.setText("Lower");



        newBox.getChildren().addAll(fetchBtn,drawCardBtn,higherBtn,lowerBtn);

        ImageView drawnCard = new ImageView();

        //Spacer between left nodes and right nodes
        final Pane spacer = new Pane();
        HBox.setHgrow(spacer, Priority.ALWAYS);
        spacer.setMinSize(10, 1);

        //FlowPane to add drawn cards
        FlowPane drawnCards = new FlowPane();
        drawnCards.setPadding(new Insets(5,5,5,5));
        drawnCards.setMaxSize(360, 100);
        drawnCards.setStyle("-fx-background-color: #008080");

        topContainer.getChildren().addAll(insertNbr,cardNbr,submitBtn,spacer,drawnCards);


        /*This is the main pane that will
         * hold all of the other panes 
         * and components
         */
        BorderPane mainPane = new BorderPane();
        mainPane.setTop(topContainer);
        mainPane.setLeft(newBox);
        mainPane.setCenter(drawnCard);

        Scene scene = new Scene(mainPane, 1000, 700);
        primaryStage.setTitle("Card Game");
        primaryStage.setResizable(false);
        primaryStage.setScene(scene);
        primaryStage.show();

        deck firstDeck = new deck();
        deck secondDeck = new deck();

        firstDeck.Deck = firstDeck.shuffleDeck(firstDeck.Deck);



        submitBtn.setOnAction(e->{
            int number = Integer.parseInt(cardNbr.getText());
            secondDeck.Deck = secondDeck.randomCardsSelector(number, firstDeck.Deck);

            fetchBtn.setDisable(false);
            submitBtn.setDisable(true);

            for(int i = 0; i<number; i++) {
                int x = secondDeck.Deck.get(i);
                String url = new String("bin/"+ x +".png");
                File file1 = new File(url);
                Image image1 = new Image(file1.toURI().toString());
                ImageView imageView = new ImageView(image1);
                imageView.setFitHeight(90);
                imageView.setFitWidth(90);
                drawnCards.getChildren().add(imageView);
            }
        });



        fetchBtn.setOnAction(e->{
            fetchBtn.setDisable(true);

            ArrayList<Integer> selectedNewCard= new ArrayList<Integer>();
            selectedNewCard = firstDeck.randomCardsSelector(1, firstDeck.Deck);

            int s = selectedNewCard.get(0);
            String url = new String("bin/" + s + ".png");
            File file2 = new File(url);
            Image img = new Image(file2.toURI().toString());
            drawnCard.setImage(img);
            drawnCard.setFitHeight(150);
            drawnCard.setFitWidth(150);
        });

        drawCardBtn.setOnAction(e->{
            drawCardBtn.setDisable(false);

            ArrayList<Integer> oneCard = new ArrayList<Integer>();
            oneCard = secondDeck.randomCardsSelector(1,secondDeck.Deck);
            int number = oneCard.get(0);
            String url = new String("bin/" + number + ".png");
            File file3 = new File(url);
            Image image = new Image(file3.toURI().toString());
            drawnCard.setImage(image);
            drawnCards.getChildren().get(0).setStyle("-fx-opacity: 0.5");
        });



     //drawnCards.getChildren().get(3).setStyle("-fx-opacity: 0.5");
    }


    public static void main(String[] args) {


        launch(args);

    }

}

I have tried without a class using a local variable same problem.

A gui should open up and I can submit the number of cards I want and will randomly select from a deck. and other buttons on gui also

Here is the stack trace
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Na`enter code here`tive Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
    at MainGUI$1deck.shuffleDeck(MainGUI.java:36)
    at MainGUI.start(MainGUI.java:135)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    ... 1 more
Exception running application MainGUI
tony_h
  • 95
  • 2
  • 10

1 Answers1

1

Your code has at least two problems:

  1. Defined a class within a method
  2. NullPointerException

You defined your class deck within your start() method:

public class MainGUI extends Application {

    public void start(Stage primaryStage) {

        class deck {
        }
    }
}

That will not work. Move the class deck outside of the MainGUI class:

public class MainGUI extends Application {

    public void start(Stage primaryStage) {
    }
}

class deck {
}

NullPointerException

From your stack trace:

Caused by: java.lang.NullPointerException
    at MainGUI$1deck.shuffleDeck(MainGUI.java:36)

This concerns the following method:

public ArrayList<Integer> shuffleDeck(ArrayList<Integer> Deck) {
    int x = 52;
    for (int i = 1; i <= x; ++i) {
        Deck.add(i);
    }
    Collections.shuffle(Deck);
    return Deck;

}

The only real variable that can be null here (and therefore cause the exception) is the Deck variable. So make shure it is not null.

In your code it is null because you create a new instance of deck and expect the class member Deck to be set, but it is actually null.

See:

deck firstDeck = new deck();

firstDeck.Deck = firstDeck.shuffleDeck(firstDeck.Deck);

Here firstDeck.Deck will be null. One way to solve this is to immediately initialise the Deck class member when you create a new deck instance:

class deck {
    public ArrayList<Integer> Deck = new ArrayList<>();
}

Jens
  • 20,533
  • 11
  • 60
  • 86