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