Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按按钮时更新ArrayList中显示的图像_Java_Arraylist_Javafx - Fatal编程技术网

Java 按按钮时更新ArrayList中显示的图像

Java 按按钮时更新ArrayList中显示的图像,java,arraylist,javafx,Java,Arraylist,Javafx,我目前正在用Java开发一款高级纸牌游戏 我有一个带有播放、交易和退出按钮的JavaFXUI。 我创建了4个玩家,记录了最大的数字,并在UI中显示这些卡。 现在,每次按下“发牌”按钮,都会发出4张牌,并显示当前一轮的赢家 现在我的问题是:如何将图像链接到ArrayList,以便在按下按钮时更新显示的卡?我知道我必须向按钮添加事件处理程序,但我不知道如何将图像链接到ArrayList,以便每次按下按钮时图像都会更改 主用户界面: import javafx.application.*; impor

我目前正在用Java开发一款高级纸牌游戏

我有一个带有播放、交易和退出按钮的JavaFXUI。
我创建了4个玩家,记录了最大的数字,并在UI中显示这些卡。
现在,每次按下“发牌”按钮,都会发出4张牌,并显示当前一轮的赢家

现在我的问题是:如何将图像链接到ArrayList,以便在按下按钮时更新显示的卡?我知道我必须向按钮添加事件处理程序,但我不知道如何将图像链接到ArrayList,以便每次按下按钮时图像都会更改

主用户界面:

import javafx.application.*;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.Rectangle2D;
import javafx.scene.image.Image;
import javafx.scene.shape.Rectangle;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.FontPosture;
import javafx.scene.layout.*;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.scene.control.*;
import javafx.scene.paint.Color;


public class Main extends Application {
    Stage window;
    Scene scene1, scene2, scene3;
    public static void main(String[] args) {
        launch(args);
    }
    @Override
    public void start(Stage primaryStage) {
        window = primaryStage;
        // Root node

        Group root = new Group();

//Button 1
        Label label1 = new Label("Welcome to the JavaFx Card Game!");
        label1.setAlignment(Pos.TOP_CENTER);
        label1.setFont(Font.font("Times New Roman",
                FontWeight.EXTRA_BOLD, FontPosture.ITALIC, 200));
        label1.setStyle("-fx-background-color: Blue;");
        Button button1 = new Button("Click here to Start the Game");
        button1.setStyle("-fx-border-color: blue;");
        label1.setFont(Font.font("Times New Roman",
                FontWeight.BOLD, FontPosture.ITALIC, 20));
        button1.setOnAction(e -> window.setScene(scene2));

        //Layout 1 - children laid out in vertical column
        HBox layout1 = new HBox(20);
         layout1.getChildren().addAll(label1, button1);
       // layout1.setStyle("-fx-border-color: red; -fx-background-color: Blue;");
        scene1 = new Scene(layout1, 500, 500);


//Button 2
        Button button2 = new Button("Go Back to Main page");
        button2.setOnAction(e -> window.setScene(scene1));
        button2.setStyle("-fx-border-color: red;");
//Button 3
        Button button3 = new Button("Play");
        button3.setStyle("-fx-border-color:orange;");
        button3.setOnAction(e -> window.setScene(scene3));

//Button 4
        Button button4 = new Button("Deal");
        button4.setStyle("-fx-border-color:yellow;");
//Button 5
        Button button5 = new Button("Exit");
        button5.setStyle("-fx-border-color:pink");

        // creating cards box

        Rectangle rectangle = new Rectangle(10,50,200, 300);

        rectangle.setArcHeight(15);
        rectangle.setArcWidth(15);
        rectangle.setStroke(Color.BLACK);
        rectangle.setFill(Color.AQUA);

        Rectangle rectangle2 = new Rectangle(20,200,200, 300);

        rectangle2.setArcHeight(15);
        rectangle2.setArcWidth(15);
        rectangle2.setStroke(Color.BLACK);
        rectangle2.setFill(Color.AQUA);

        Rectangle rectangle3 = new Rectangle(10,50,200, 300);

        rectangle3.setArcHeight(15);
        rectangle3.setArcWidth(15);
        rectangle3.setStroke(Color.BLACK);
        rectangle3.setFill(Color.AQUA);

        Rectangle rectangle4 = new Rectangle(20,200,200, 300);

        rectangle4.setArcHeight(15);
        rectangle4.setArcWidth(15);
        rectangle4.setStroke(Color.BLACK);
        rectangle4.setFill(Color.AQUA);



//Layout 2
        HBox layout2 = new HBox();
        layout2.setPadding(new Insets(100, 100, 100, 100));
        layout2.getChildren().addAll(button2, button3, button4, button5);
        layout2.setSpacing(25);
        layout2.setLayoutX(200);
        layout2.setLayoutY(350);



// Layout 3
        HBox layout3 = new HBox();
        layout3.setPadding(new Insets(100, 100, 100, 100));
        layout3.setSpacing(25);
        layout3.getChildren().addAll(rectangle, rectangle2, rectangle3, rectangle4);

        // adding layout 3 and layout 2
        root.getChildren().addAll(layout3, layout2);

        scene2 = new Scene(root, 600, 300);

//Display scene 1 at first
        window.setScene(scene1);
        window.setTitle("Card Game");
        window.show();

// Max the window
        Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();

        primaryStage.setX(primaryScreenBounds.getMinX());
        primaryStage.setY(primaryScreenBounds.getMinY());
        primaryStage.setWidth(primaryScreenBounds.getWidth());
        primaryStage.setHeight(primaryScreenBounds.getHeight());

        primaryStage.show();

        // Back ground Image for Layer 1
        BackgroundImage myBI= new BackgroundImage(new Image("http://i.imgur.com/LAXk1jw.png",1000,1000,false,true),
                BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT, BackgroundPosition.DEFAULT,
                BackgroundSize.DEFAULT);
//then you set to your node
        layout1.setBackground(new Background(myBI));


    }



}
卡片类别:

import java.util.ArrayList;
import java.util.Random;

public class Card {
    String finalCard = "";
     int suit, number;
    static String [] suits = {"Heart" , "Diamond" , "Spade" , "Club"}; //suits
    static String [] numbers = { "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "10" , "Jack" , "Queen" , "King" , "Ace" }; //card values
    String card = "";
    public Card() {

    }
     public Card(int suits, int numbers)
        {
            suit = suits; 
            number = numbers;
        }
     public int getSuit()
     {
       return suit;
     }   


    public String toString()
        {
            String finalCard = numbers[number] + " of " + suits[suit];
            return finalCard;        
        }
    }
甲板等级:

import java.util.ArrayList;
import java.util.Random;

public class FullDeck {
    private ArrayList<Card> cards = new ArrayList<Card>();//card array list

        public FullDeck()
        {   
            for(int a =0; a<=3; a++) //loops through suits
            {
                for(int b =0; b<=12;b++) //loops through values
                {
                    cards.add(new Card(a,b)); //creates adds cards to list
                }

            }

        }

        public Card drawRandomCard()
        {
            Random generator = new Random(); //picks random card
            int index = generator.nextInt(cards.size());
            return cards.remove(index); //removes card from list
        }

        public String toString()
        {
            String result = "Cards remaining in deck: " + cards; //not currently used
            return result;
        }    
    }
import java.util.ArrayList;
导入java.util.Random;
公务舱全甲板{
private ArrayList cards=new ArrayList();//卡数组列表
公共甲板()
{   

对于(int a=0;a您不将图像链接到ArrayList。您将图像链接到卡。只需在您的卡类中创建对图像的引用。遍历卡并逐个加载图像


关于您的代码,我建议您不要一直使用随机调用卡上的。除此之外,我会为西服和军衔创建枚举。如果您愿意,可以查看一些。因此,您希望在按下按钮时更新显示的图像,对吗

听起来你希望
ArrayList
能发挥一些魔力。
我甚至不确定
ArrayList
是你想要的,我也不知道你为什么会这么想

但它的工作原理如下:

你需要在某个地方有某种形式的图像。JavFX的方法是一个数组。
您可以根据自己的喜好在任何
家长中添加和删除这些内容(请注意,您不能绘制两次相同的
ImageView
,但这种情况不应出现在您的纸牌游戏中)。
您需要将事件处理程序添加到按钮中,以完成以下操作:添加和删除图像(通过
parent.getChildren().add()
/
parent.getChildren().remove()


原始答案(也应该有效,但不是“JavaFX方式”):

你需要在某个地方有某种形式的图像。最直接的方法可能是一组
图像

然后你需要一个地方在某处画你的图像。同样,最简单的方法可能是在你的
HBox
中添加你需要画的卡片的数量。

然后,您需要将事件处理程序添加到按钮以更新这些画布。在当前卡片发生更改后,对于每个可见的卡片,您需要从
图像
数组中获取正确的图像,并使用
画布

将其绘制在右侧画布的底部。在JavaFX中,这不是纸牌游戏的方式。您使用像ImageV这样的节点查看以显示卡片。您不能直接在画布上绘制。