无法从jpanel中删除组件

问题描述 投票:0回答:1

我重构了代码以产生一个最小的,可复制的示例。

问题-我无法从面板上移除卡(我已在发生问题的代码中进行了注释,请参阅类“ ClearCardEventListener”。]]

下面的完整代码。

在运行程序之前,您将需要下载一个图像并将其添加到资源文件夹= https://ibb.co/MNccGS0

  1. 运行程序
  2. 单击“添加卡”按钮(这将在面板上添加2心图像图标)
  3. 单击“清除卡”按钮(这是问题,我无法从面板上删除卡)

  4. package debug.debug;
    
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    public class App extends JFrame {
        public static void main(String[] args) {
            App app = new App();
    
            Insets insets = app.getInsets();
            app.setSize(300 + insets.left + insets.right,
                300 + insets.top + insets.bottom);
        }
    
        JPanel panel;
        JButton clearCardButton;
        JButton addCardButton;
    
        List<Card> playerCards = new ArrayList<Card> ();
    
        Deck deck = new Deck();
    
        public App() {
            setTitle("BlackJack Game");
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            panel = new JPanel();
            add(panel);
            panel.setLayout(null);
            addCardButton = new JButton("Add card");
            clearCardButton = new JButton("Clear card");
    
            panel.add(addCardButton);
            panel.add(clearCardButton);
    
            addCardButton.addActionListener(new AddCardEventListener(this, this.deck));
            clearCardButton.addActionListener(new ClearCardEventListener(this, this.deck));
    
            addCardButton.setBounds(150, 50, addCardButton.getPreferredSize().width, addCardButton.getPreferredSize().height);
            clearCardButton.setBounds(150, 100, clearCardButton.getPreferredSize().width, clearCardButton.getPreferredSize().height);
    
        }
    
        public JPanel getPanel() {
            return panel;
        }
    
        public void addPlayerCard(Card card) {
            playerCards.add(card);
        }
    
        public List<Card> getPlayerCards() {
            return playerCards;
        }
    
        public List<JLabel> getPlayerCardLabels() {
    
            List<JLabel> playerCardLabels = new ArrayList<JLabel> ();
    
            for (int i = 0; i<this.getPlayerCards().size(); i++) {
                playerCardLabels.add(this.getPlayerCards().get(i).getCardLabel());
    
            }
    
            return playerCardLabels;
        }
    
    }
    
    class AddCardEventListener implements ActionListener {
    
        private App app;
        private Deck deck;
    
        AddCardEventListener(App app, Deck deck) {
            this.app = app;
            this.deck = deck;
        }
    
        public void actionPerformed(ActionEvent arg0) {
    
            // Player gets a card
            app.addPlayerCard(deck.getCard());
    
            // Display that player's card
            app.getPanel()
                .add(app.getPlayerCards().get(0).getCardLabel()).setBounds(0, 0, 72, 96);
    
        }
    
    }
    
    class ClearCardEventListener implements ActionListener {
    
        private App app;
        private Deck deck;
    
        ClearCardEventListener(App app, Deck deck) {
            this.app = app;
            this.deck = deck;
        }
    
        public void actionPerformed(ActionEvent arg0) {
    
            System.out.println("DEBUG: " + app.getPlayerCards().get(0).getCardLabel());
    
            /***
             * 
             * NOT ABLE TO REMOVE CARD, WHY ???
             * 
             */
    
            app.getPlayerCards().get(0).getCardLabel().setIcon(null);
            app.getPlayerCards().get(0).getCardLabel().revalidate();
            app.getPlayerCards().get(0).getCardLabel().repaint();
    
            app.getPanel().remove(app.getPlayerCards().get(0).getCardLabel());
    
        }
    
    }
    
    class Card {
    
        private String suit;
        private String rank;
        private int value;
    
        public void setSuit(String suit) {
            this.suit = suit;
        }
        public void setRank(String rank) {
            this.rank = rank;
        }
        public void setValue(int value) {
            this.value = value;
        }
        public String getSuit() {
            return suit;
        }
        public String getRank() {
            return rank;
        }
        public int getValue() {
            return value;
        }
    
        // Hardcoded for debugging, so every card image is a 2 of hearts
        public JLabel getCardLabel() {
            return new JLabel(new ImageIcon(getClass()
                .getResource("/cards/2h.png")));
        }
    }
    
    class Deck {
    
        private final String RANKS[] = {
            "Ace",
            "Deuce",
            "Three",
            "Four",
            "Five",
            "Six",
            "Seven",
            "Eight",
            "Nine",
            "Ten",
            "Jack",
            "Queen",
            "King"
        };
        private final String SUITS[] = {
            "Spades",
            "Hearts",
            "Diamonds",
            "Clubs"
        };
    
        private Card[] deck;
        static private int cardPosition = 0;
    
        public Deck() {
            deck(); // Create the deck
            shuffle(); // shuffle the deck
        }
    
        public Card[] deck() {
            deck = new Card[52];
    
            for (int x = 0; x<deck.length; x++) {
                String rankTemp = RANKS[x % 13];
                String suitTemp = SUITS[x / 13];
                deck[x] = new Card();
                deck[x].setRank(rankTemp);
                deck[x].setSuit(suitTemp);
                deck[x].setValue((x % 13) + 1);
                if (deck[x].getValue() > 10)
                    deck[x].setValue(10);
                else if (deck[x].getValue() == 1)
                    deck[x].setValue(11);
            }
    
            return deck;
        }
    
        public void shuffle() {
            Collections.shuffle(Arrays.asList(deck()));
        }
    
        public Card[] getDeck() {
            return deck;
        }
    
        public Card getCard() {
            return deck[cardPosition++];
        }
    
    }
    

我已经重构了代码,以产生一个最小的,可复制的示例。问题-我无法从面板上卸下卡(我在发生问题的代码中进行了注释,请参阅类“ ...

java oop jpanel jcomponent
1个回答
0
投票

问题1

© www.soinside.com 2019 - 2024. All rights reserved.