如何将图像链接到数字和描述?

时间:2015-03-29 20:48:02

标签: java image arraylist javafx imageview

我在尝试使用我正在写的纸牌游戏程序时遇到了麻烦。游戏基本上就像战争中有4名玩家,每个玩家获得一张牌,最高牌获胜。卡片应该是从2-Ace排列的,套装的等级是:俱乐部,钻石,心形和黑桃。我这里有一个算法用于游戏,我还有一个文件夹来存放卡片。我遇到的问题是尝试用arraylist中的数字连接每张卡片,这样当用户按下交易按钮时,它会将每张卡片交给他们,然后比较它们并打印出获胜者。回合。这是我的代码。现在我打开了UI,随机卡出现在每个播放器框中。我再次遇到的问题是尝试将这些卡与特定号码和描述相关联,并且每次都要获得交易按钮以处理4张新卡。请帮忙!附:我知道我的代码非常混乱,很多东西没有被使用,这些只是我一直在尝试的东西。

    import java.io.File;
    import java.util.ArrayList;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import java.util.Collections;
    import java.util.EnumSet;
    import java.util.List;
    import javafx.application.Application;
    import javafx.event.*;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.stage.Stage;
    import javafx.scene.layout.*;
    import javafx.scene.control.Label;
    import javafx.geometry.*;
    import java.util.*;

    import javafx.scene.Node;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.paint.Color;

    import javax.swing.*;

 public class War extends Application {
public static void main(String[] args) {
    launch(args);
}

List<Integer> deck;
ArrayList<ImageView> imager = new ArrayList<ImageView>();
private int roundCounter;
JButton button = new JButton();

@Override
public void start(Stage primaryStage) {
    loadDeck();
    loadCards();
    //Panes
    BorderPane bPain = new BorderPane();
    VBox vBox = new VBox(100);
    vBox.setPadding(new Insets(5, 5, 5, 5));
    HBox buttonBox = new HBox(100);
    buttonBox.setPadding(new Insets(25, 25, 25, 75));
    buttonBox.setStyle("-fx-background-color: blue");

    bPain.setLeft(new P1Pane("PLayer 1"));
    bPain.setRight(new P2Pane("PLayer 2"));
    BorderPane bPain2 = new BorderPane();
    bPain2.setRight(new P3Pane("PLayer 4"));
    bPain2.setLeft(new P4Pane("PLayer 3"));

    //VBox vBox2 = new VBox(100);
    //vBox2.setPadding(new Insets(5, 5, 5, 5));


    BorderPane bPain3 = new BorderPane();
    DeckPane dPane = new DeckPane("Deck");


    bPain3.setCenter(dPane);
    bPain3.setMargin(dPane, new Insets(5, 5, 5, 5));
    bPain3.setCenter(dPane);

    //Buttons
    Button pBtn = new Button("PLAY");
    Button dBtn = new Button("DEAL");
    Button endBtn = new Button("END GAME");
    buttonBox.getChildren().addAll(pBtn, dBtn , endBtn);

    //vBox.getChildren().add(buttonBox);
    vBox.getChildren().addAll(buttonBox, bPain, bPain3, bPain2);
    //vBox2.getChildren().add(bPain3);
    //vBox.getChildren().add(vBox2);
  /*
    pBtn.setOnAction(
            p -> {System.out.println("Play pressed");});

    dBtn.setOnAction(
            d -> {
                //deals remaining cards
                int[] wins=new int[4];
                wins[0]=0;wins[1]=0;
                wins[2]=0;wins[3]=0;

                System.out.println("Round: "+(roundCounter++));
                int prev=-1;
                int winner=1;
                for(int j=0;j<4;j++)
                {
                    System.out.println("Player "+(j+1)+" card: "+deck.get(0));
                    if(prev<deck.get(0))
                    {
                        winner=j+1;
                        prev=deck.get(0);
                    }
                    deck.remove(deck.get(0));
                }
                System.out.println("Winner is player: " +winner);
                System.out.println();
                wins[winner-1]++;
                //shuffle after each round


                //only enabled after play button and there are cards left
                System.out.println("Deal pressed");
            });

    endBtn.setOnAction(
            e -> {
                //when pressed, popup asks if sure
                //disabled after
                //resets number of wins
                System.out.println("End pressed");
            });
 */


    //Stage set
    primaryStage.setTitle("WAR!!!");
    //primaryStage.setScene(new Scene(vBox2, 100, 100));
    primaryStage.setScene(new Scene(vBox, 500, 500));

    primaryStage.show();
}

public void loadCards() {

    String path = "/users/ebrovski/Desktop/card";
    String files;
    File folder = new File(path);
    Image[] images = new Image[100];
    File[] listOfFiles = folder.listFiles();
    int j = 0;
    for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].getName().endsWith("png")) {
            System.out.println(listOfFiles[i].getAbsolutePath());

            files = "file:" + listOfFiles[i].getAbsolutePath();
            System.out.println(files);

            images[j] = new Image(files, 200, 200, true, true);

            j++;
        }
    }

    for(int k = 0; k < deck.size(); k++) {
        imager.add(new ImageView(images[deck.get(k)]));

    }
}



public void loadDeck() {
    deck = new ArrayList<Integer>();
    for(int i =0; i < 52; i++) {
        deck.add(i);
    }
    Collections.shuffle(deck);
}


//Player Panes
class P1Pane extends Pane {
    public P1Pane(String player) {
        Label playerTitle = new Label(player);
        getChildren().add(playerTitle);
        setStyle("-fx-border-color: black");
        //setStyle("-fx-background-color: green");
        setPadding(new Insets(75, 1, 1, 1));
        getChildren().add(imager.get(10));

    }
}

class P2Pane extends Pane {
    public P2Pane(String player) {
        Label playerTitle = new Label(player);
        getChildren().add(playerTitle);
        setStyle("-fx-border-color: black");
        //setStyle("-fx-background-color: green");
        setPadding(new Insets(75, 1, 1, 1));
        getChildren().add(imager.get(20));
    }
}
class P3Pane extends Pane {
    public P3Pane(String player) {
        Label playerTitle = new Label(player);
        getChildren().add(playerTitle);
        setStyle("-fx-border-color: black");
        //setStyle("-fx-background-color: green");
        setPadding(new Insets(75, 3, 3, 3));
        getChildren().add(imager.get(40));

    }
}

class P4Pane extends Pane {
    public P4Pane(String player) {
        Label playerTitle = new Label(player);
        getChildren().add(playerTitle);
        setStyle("-fx-border-color: black");
        //setStyle("-fx-background-color: green");
        setPadding(new Insets(75, 3, 3, 3));
        getChildren().add(imager.get(30));
    }
}


//Deck Pane
class DeckPane extends Pane {
    public DeckPane(String deckName) {
        Label deckTitle = new Label(deckName);
        getChildren().add(deckTitle);

        setStyle("-fx-border-color: black");
        //setStyle("-fx-background-color: forestgreen");
        setPadding(new Insets(75, 3, 3, 3));

    }
}
    /*
    public enum Suit {

SPADES(Color.BLACK, "\u2660"),
HEARTS(Color.RED, "\u2665"),
CLUBS(Color.BLACK, "\u2663"),
DIAMONDS(Color.RED, "\u2666"),
;

Color color;
String name;

Suit( Color color, String name) {
    this.color = color;
    this.name = name;
}

public Color getColor() {
    return color;
}

public String getName() {
    return name;
}
  }

     public enum Rank {

ACE( "A"),
_2( "2"),
_3("3"),
_4("4"),
_5("5"),
_6("6"),
_7("7"),
_8("8"),
_9("9"),
_10("10"),
JACK("J"),
QUEEN("Q"),
KING("K")
;

String name;

Rank( String name) {
    this.name = name;
}

public String getName() {
    return name;
}
 }

    class Card extends Pane {



Node frontFace;
Node backFace;

boolean isFaceUp;

double w = 60;
double h = 90;

Suit suit;
Rank rank;

public Card( Suit suit, Rank rank) {

    this.suit = suit;
    this.rank = rank;

    Image image = new Image("http://upload.wikimedia.org/wikipedia/commons/thumb/0/03/King_of_spades_fr.svg/123px-King_of_spades_fr.svg.png");
    ImageView iv1 = new ImageView();
     iv1.setImage(image);
     ImageView iv2 = new ImageView();
     iv2.setImage(image);
    frontFace = iv1;
    backFace = iv2;

    getChildren().addAll( frontFace, backFace);

    setFaceDown();
}

public void setFaceUp() {

    frontFace.setVisible(true);
    backFace.setVisible(false);

    isFaceUp = true;
}

public void setFaceDown() {

    frontFace.setVisible(false);
    backFace.setVisible(true);

    isFaceUp = false;
}

public boolean isFaceUp() {
    return isFaceUp;
}

public Suit getSuit() {
    return suit;
}

public Rank getRank() {
    return rank;
}


public String toString() {
    return suit + " " + rank;
}
*/

 }

1 个答案:

答案 0 :(得分:0)

有很多解决方案。例如,我会给你两个。

  1. 创建包含cardId变量和图像变量的自有类卡。

    class Card(){

    int cardId; 图像卡图像;

    }

    添加构造函数,getter,setter。

  2. 将Image类扩展为CardImage

    类CardImage扩展Image {    int cardId;  }

    添加构造函数,如果需要,调用超级构造函数,添加getter和setter。

  3. 这是我的例子。主要思想是使用常用方法创建Abstract CardItem,然后将其扩展到任何类型的卡。然后在我加载Deck类中的所有卡后,我的所有程序都与CardItem对象一起使用。每个对象都有自己的图像和在加载时分配的等级编号。

    Class CardItem:

    package classes;
    
    import java.awt.Dimension;
    import java.awt.Image;
    import java.awt.Insets;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    
    @SuppressWarnings("serial")
    public abstract class CardItem extends JButton implements Comparable<CardItem> {
    
        private int rank;
        ImageIcon cardIcon;
        ImageIcon coverIcon;
    
        public CardItem() {
            this.rank = 0;
        }
    
        /** Constructor, create card by image file */
        public CardItem(String fileName)
        {
            this();
    
            // Load images for two sides from resources
            URL url = ClassLoader.getSystemClassLoader().getResource(fileName);
    
            BufferedImage bi = null;
            try {
                bi = ImageIO.read(url);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            Image resizedImage = bi.getScaledInstance(128, 186, 0);
    
            cardIcon = new ImageIcon(resizedImage);     
    
            setSize(cardIcon.getImage().getWidth(null), cardIcon.getImage().getHeight(null));
            setPreferredSize(new Dimension(128, 186));
            setIcon(cardIcon);
            setMargin(new Insets(0,0,0,0));
            setIconTextGap(0);
            setBorderPainted(false);
            setBorder(null);
            setText(null);
    
            /* Load cover */
            url = ClassLoader.getSystemClassLoader().getResource("cover.png");
    
            bi = null;
            try {
                bi = ImageIO.read(url);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            resizedImage = bi.getScaledInstance(128, 186, 0);
    
            coverIcon = new ImageIcon(resizedImage);        
        }
    
        /**
         *  Constructor. Create card by image file and rank
         * @param fileName as string
         * @param rank as integer
         */
        public CardItem(String fileName, int rank)
        {
            this(fileName);
    
            // Set rank
            this.rank = rank;
        }
    
        /**
         * Get card's rank
         * @return rank as integer
         */
        public int getRank()
        {
            return this.rank;
        }
    
        /**
         * Set card's rank
         * @param rank
         */
        public void setRank(int rank)
        {
            this.rank = rank;
        }
    
        /**
         * Compare two cards by it's rank
         */
        @Override
        public int compareTo(CardItem other) {
            return this.getRank() - other.getRank();
        }
    
        /**
         * Define which suit is the card 
         * @return rank as string
         */
        public abstract int getSuitValue();
    
        @Override
        public String toString() {
            return ("Suit: " + this.getSuitValue() + "; " +
            "Rank: " + this.getRank());
        }
    
        /**
         * Show card's cover side
         */
        public void showCover()
        {
            setSize(coverIcon.getImage().getWidth(null), coverIcon.getImage().getHeight(null));
            setPreferredSize(new Dimension(128, 186));
            setIcon(coverIcon);
            setMargin(new Insets(0,0,0,0));
            setIconTextGap(0);
            setBorderPainted(false);
            setBorder(null);
            setText(null);
        }
    
        /**
         * Show card's shape side
         */
        public void showCard()
        {
            setIcon(cardIcon);
        }
    }
    

    Class CardClubs:

    package classes;
    
    @SuppressWarnings("serial")
    public class CardClubs extends CardItem {
    
        private final static int  SUIT_VALUE = 3;
    
        public CardClubs(String fileName) {
            super(fileName);
        }
    
        public CardClubs(String fileName, int i) {
            super(fileName, i);
        }
    
        /**
         * @return the SUIT_VALUE
         */
        @Override
        public int getSuitValue() {
            return SUIT_VALUE;
        }
    }
    

    Class CardDiamonds

    package classes;
    
    @SuppressWarnings("serial")
    public class CardDiamonds extends CardItem {
    
        private final static int  SUIT_VALUE = 1;
    
        public CardDiamonds(String fileName) {
            super(fileName);
        }
    
        public CardDiamonds(String fileName, int i) {
            super(fileName, i);
        }
    
        /**
         * @return the SUIT_VALUE
         */
        @Override
        public int getSuitValue() {
            return SUIT_VALUE;
        }
    }
    

    Class Deck:

    package classes;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class Deck {
    
        List<CardItem> cards;
        int cardsUsed;
    
        /**
         * Fill the deck with graphics cards
         */
    
        public Deck() {     
            this.cards = new ArrayList<CardItem>();
            this.cardsUsed = 0;
    
            // Fill Hearts
            for (int i = 2; i < 11; i++)
            {
                this.cards.add(new CardHearts(i+"_of_hearts.png", i));
            }
    
            // Fill clubs
            for (int i = 2; i < 11; i++)
            {
                this.cards.add(new CardClubs(i+"_of_clubs.png", i));
            }
    
            // Deck fill spades
            for (int i = 2; i < 11; i++)
            {
                this.cards.add(new CardSpades(i+"_of_spades.png", i));
            }
    
            // Fill diamonds
            for (int i = 2; i < 11; i++)
            {
                this.cards.add(new CardDiamonds(i+"_of_diamonds.png", i));
            }
    
            // Fill others cards
            String tp = "diamonds";
            this.cards.add(new CardDiamonds("king_of_"+tp.toString()+".png", 13));
            this.cards.add(new CardDiamonds("queen_of_"+tp.toString()+".png", 12));
            this.cards.add(new CardDiamonds("jack_of_"+tp.toString()+".png", 11));
            this.cards.add(new CardDiamonds("ace_of_"+tp.toString()+".png", 14));
    
            tp = "hearts";
            this.cards.add(new CardHearts("king_of_"+tp.toString()+".png", 13));
            this.cards.add(new CardHearts("queen_of_"+tp.toString()+".png", 12));
            this.cards.add(new CardHearts("jack_of_"+tp.toString()+".png", 11));
            this.cards.add(new CardHearts("ace_of_"+tp.toString()+".png", 14));
    
            tp = "clubs";
            this.cards.add(new CardClubs("king_of_"+tp.toString()+".png", 13));
            this.cards.add(new CardClubs("queen_of_"+tp.toString()+".png", 12));
            this.cards.add(new CardClubs("jack_of_"+tp.toString()+".png", 11));
            this.cards.add(new CardClubs("ace_of_"+tp.toString()+".png", 14));
    
            tp = "spades";
            this.cards.add(new CardSpades("king_of_"+tp.toString()+".png", 13));
            this.cards.add(new CardSpades("queen_of_"+tp.toString()+".png", 12));
            this.cards.add(new CardSpades("jack_of_"+tp.toString()+".png", 11));
            this.cards.add(new CardSpades("ace_of_"+tp.toString()+".png", 14));
        }
    
        /**
         * Shuffle all cards
         */
        public void shuffle()
        {
            Collections.shuffle(this.cards);
        }
    
        public int cardsLeft()
        {
            return this.cards.size();
    
        }
    
        public List<CardItem> getCards()
        {
            return this.cards;
        }
    
        /**
         * Remove random card
         * @return card as CardItem
         */
        public CardItem dealCard()
        {
            shuffle();
    
            CardItem dealCard = this.cards.get(this.cards.size()-1);
    
            this.cards.remove(dealCard);
    
            this.cardsUsed++;
    
            return dealCard;
    
        }
    }