

度々のご質問失礼いたします。  
現在、ペア不成立の場合にメッセージを表示して「カードを伏せる」`JButton`を活性化 ->
`JButton`押下でカードを伏せる処理を追加しているのですが、「カードを伏せる」`JButton`を活性化させる処理までは記載できたのですが、以下コードを「カードを伏せる」`JButton`を活性化した後に処理されるように追加する方法で詰まっています。

[code]

    gameDate.getCard_one().setOpen(false);
    gameDate.getCard_two().setOpen(false);
    gameDate.setCard_one(null); // Card_oneをリセット
    gameDate.setCard_two(null); // Card_twoをリセット
    
[/code]

`ActionCommand`で行った場合は、メッセージの「はい」を押下した時点で裏面になってしまいます。  
お手数ですが、ご教示いただけますと幸いです。

**Cardclick_Listener.java**

[code]

    package pair_matching;
    
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    import javax.swing.JOptionPane;
    
    public class Cardclick_Listener implements MouseListener{
        private CardLabel card_label;
        private GameDate gameDate;
        private CardList cardList;
        
        public Cardclick_Listener(CardLabel card_label, GameDate gameDate, CardList cardList) {
            this.card_label = card_label;
            this.gameDate = gameDate;
            this.cardList = cardList;
        }
        
        @Override
        public void mouseClicked(MouseEvent e) {
            boolean open = card_label.isOpen();
            int Pair = gameDate.getPairCount();
            
            // カードの表裏チェック
            if(open == true) {
                ; // 裏面にしない
            }else if(open == false){
                card_label.setOpen(true);
                if(gameDate.getCard_one() == null) {
                    // nullの場合：GameDateのCard_oneに格納
                    gameDate.setCard_one(card_label);
                    return;
                }else{
                    // null以外:GameDateのCard_twoに格納
                    gameDate.setCard_two(card_label);
                }
            }
        
            /* ペア成立 */
            if(gameDate.getCard_two().getNumber() == gameDate.getCard_one().getNumber()) {
                if(open == true) {
                    gameDate.setPairCount(Pair += 0); // 表のカードを押下した時に2がカウントされないようにする
                }else {
                    /* ゲームクリアの条件
                     * 52枚揃ったらクリア
                     * */
                    gameDate.setPairCount(Pair += 2); // 枚数のカウント
                    gameDate.setCard_one(null); // Card_oneをリセット
                    gameDate.setCard_two(null); // Card_twoをリセット
                    
                    if(Pair == 52) {
                        int option = JOptionPane.showConfirmDialog(null, "GAME CREA!!! 「はい」を押下でゲームを再開できます。", "GAME CREA", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE);
                        if(option == JOptionPane.YES_OPTION) {
                            cardList.Restart_cards(); // カードを全て裏面にする
                            gameDate.setPairCount(0); // 枚数カウントのリセット
                        }else {
                            System.exit(0); // ゲーム終了
                        }
                    }
                }
                /* ペア不成立 */
            }else{
                /*
                 *cardListのrevers_btnを活性化させる処理を追加
                 * */
                int missmatch = JOptionPane.showConfirmDialog(null, "カードが一致していません。", "カードの不一致", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
                if(missmatch == JOptionPane.OK_OPTION) {
                    cardList.revers_btn.setEnabled(true);
                }else {
                    return;
                }
                
                /*
                 * cardListのrevers_btnを押下した時の処理を追加
                 * */
                
                // Card_oneとCard＿twoを裏面に戻す
                
                
            }
        }
    
        @Override
        public void mousePressed(MouseEvent e) {
        }
        @Override
        public void mouseReleased(MouseEvent e) {
        }
        @Override
        public void mouseEntered(MouseEvent e) {
        }
        @Override
        public void mouseExited(MouseEvent e) {
        }
    
    }
    
    
[/code]

**CardList.java**

[code]

    package pair_matching;
    
    import java.awt.Dimension;
    import java.util.ArrayList;
    import java.util.Collections;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    
    public class CardList extends JPanel{
        private GameDate gameDate = new GameDate();
        JButton revers_btn;
        
        // ラベルをリストにする -> リストの各ラベルにImageIconをセット -> リストをコレクションシャッフル
        boolean flg = false;
        
        final int club = 0;
        final int diamond = 1;
        final int heart = 2;
        final int spade = 3;
        
        /* カード画像 */
        // 裏面
        ImageIcon card_back = new ImageIcon("image/card_back.png");
        // 表面
        ImageIcon[][] card_array = new ImageIcon[4][13];
        String filename;
        
        // jの数値
        int[] number = {
            1,2,3,4,5,6,7,8,9,10,11,12,13,
            1,2,3,4,5,6,7,8,9,10,11,12,13,
            1,2,3,4,5,6,7,8,9,10,11,12,13,
            1,2,3,4,5,6,7,8,9,10,11,12,13
        };
        
        // カードをリスト化
        ArrayList<CardLabel> cards = new ArrayList<>();
        
        public CardList() {
            setPreferredSize(new Dimension(1150, 600));
            Start_card_list();
            Revers_button();
        }
        
        public void Start_card_list() {
            // Card_image
            for(int i = 0; i < card_array.length; i++) {
                for(int j = 0; j < card_array[i].length; j++) {
                    filename = "image/card";
                    switch(i) {
                    case club:
                        filename = filename + "_club_";
                        break;
                    case diamond:
                        filename = filename + "_diamond_";
                        break;
                    case heart:
                        filename = filename + "_heart_";
                        break;
                    case spade:
                        filename = filename + "_spade_";
                        break;
                    }
                    // ファイル名に数字を足す -> 拡張子を足す
                    filename = String.format(filename + "%02d", j+1);
                    filename = filename + ".png";
                    card_array[i][j] = new ImageIcon(filename);
                    CardLabel tmp_label = new CardLabel(card_array[i][j],card_back,number[j]);
                    // tmp_labelを押下したら、ひっくり返るのはtmp_label
                    tmp_label.addMouseListener(new Cardclick_Listener(tmp_label, gameDate, this));
                    add(tmp_label);
                    cards.add(tmp_label);
                    Collections.shuffle(cards);
                }
            }
            // カードのシャッフル
            for(CardLabel card_shuffle : cards) {
                add(card_shuffle);
            }
        }
        
        // Restart時にカードを裏面にする
        public void Restart_cards() {
            for(int i = 0; i < cards.size(); i++) {
                cards.get(i).setOpen(flg);
            }
        }
    
        // カードを伏せるボタン
        public void Revers_button() {
            revers_btn = new JButton("カードを伏せる");
            revers_btn.setEnabled(false);
            add(revers_btn);
        }
    }
    
    
[/code]


CC BY-SA 4.0
2021-08-18T09:19:12.237
80888
2021-08-19T02:14:46.313
47246
question
java swing
Java Swing カードを伏せるボタンを押下後にカードを伏せる処理を行いたい


自己解決いたしましたので、回答を投稿しておきます。

以下の通り`ActionListener`のクラスを追加し、そこに`JButton`の処理を追加致しました。  
カードの処理は`MouseListener`で行っていたので混ざってしまっていたようです。

[code]

    package pair_matching;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class revers_button_click implements ActionListener{
        private GameDate gameDate;
        private CardList cardList;
        
        public revers_button_click(GameDate gameDate, CardList cardList) {
            this.gameDate = gameDate;
            this.cardList = cardList;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            /* Card_oneとCard_twoを裏面にする 
             * Card_oneとCard_twoを裏面にしたら、伏せるボタンは非活性にする
             * */
            cardList.revers_btn.setActionCommand("revers");
            String cmd = cardList.revers_btn.getActionCommand();
            if(cmd.equals("revers")) {
                gameDate.getCard_one().setOpen(false);
                gameDate.getCard_two().setOpen(false);
                gameDate.setCard_one(null); // Card_oneをリセット
                gameDate.setCard_two(null); // Card_twoをリセット
                cardList.revers_btn.setEnabled(false); // Buttonを非活性に戻す
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2021-08-19T01:53:48.827
80900
2021-08-19T02:14:46.313
2021-08-19T02:14:46.313
3060
47246
80888
answer