80734


度々のご質問、失礼いたします。  
`JLabel`の記載を、CardList.javaからCardLable.javaに記載なおし、CardList.javaの下記部分を変更したところ裏面の画像が表示されなくなってしまいました。

[code]

    CardLabel tmp_label = new CardLabel(card_array[i][j],card_back,j);
    tmp_label.addMouseListener(new Cardclick_Listener(tmp_label));
    cards.add(tmp_label);
    
    
[/code]

`JPanel`にセットされていないと思い、`add(tmp_label)`を追加してみましたが表示されませんでした。  
ソースコードの不備を見つけることができず、お手数ですが、ご教示いただけますと幸いです。

**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.JPanel;
    
    public class CardList extends JPanel{
        ArrayList<CardLabel> cards = new ArrayList<>();
        // ラベルをリストにする -> リストの各ラベルに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;
        
        // 割り当て
        int[] Array2 = {
                0,1,2,3,4,5,6,7,8,9,10,11,12,
                13,14,15,16,17,18,19,20,21,22,23,24,25,
                26,27,28,29,30,31,32,33,34,35,36,37,38,
                39,40,41,42,43,44,45,46,47,48,49,50,51
        };
        
        public CardList() {
            setPreferredSize(new Dimension(1150, 550));
            
            // 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,j);
                    // tmp_labelを押下したら、ひっくり返るのはtmp_label
                    tmp_label.addMouseListener(new Cardclick_Listener(tmp_label));
                    cards.add(tmp_label);
                }
            }
            
            // 表面のカードをシャッフル
            Collections.shuffle(cards);
            
        }
    
    }
    
    
[/code]

**CardLabel.java**

[code]

    package pair_matching;
    
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    
    public class CardLabel extends JLabel{
        private int number;
        private boolean open = false;
        private ImageIcon open_icon;
        private ImageIcon reverse_icon;
        
        // コンストラクタの作成
        public CardLabel(ImageIcon open_icon, ImageIcon revers_icon, int number) {
            this.open_icon = open_icon;
            this.reverse_icon = revers_icon;
            this.number = number;
        }
    
        public int getNumber() {
            return number;
        }
    
        public boolean isOpen() {
            return open;
        }
    
        public void setOpen(boolean open) {
            if(open == true) {
                this.setIcon(open_icon);
            }else {
                this.setIcon(reverse_icon);
            }
            this.open = open;
        }
    
    }
    
    
[/code]

**Cardclick_Listener.java**

[code]

    package pair_matching;
    
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    public class Cardclick_Listener implements MouseListener{
        private CardLabel card_label;
        
        public Cardclick_Listener(CardLabel card_label) {
            this.card_label = card_label;
        }
        
        @Override
        public void mouseClicked(MouseEvent e) {
            /* CardLabel の boolean open にセット -> get で boolean open を取得
             * 
             * カードが裏 -> 表
             * 
             * 表か裏の判定
             * 
             * 開いたカードが同じ場合：裏に戻らない
             * 開いたカードが違う場合：裏に戻る
             *  */
            boolean open = card_label.isOpen();
            if(open == true) {
                card_label.setOpen(false);
            }else {
                card_label.setOpen(true);
            }
        }
    
        @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]


CC BY-SA 4.0
2021-08-11T09:36:36.833
80723
2021-08-12T02:23:56.313
2021-08-12T02:20:01.713
47246
47246
question
java swing
JLabelを別クラスで記載したら、画像が表示されない


[こちらの質問](https://ja.stackoverflow.com/q/80654/2808)の続きだと思いますが、

[code]

    cards[i].setIcon(card_back);
    
[/code]

に相当する処理が無くなっています。

例えば、`CardLabel`のコンストラクタで設定することになるでしょう。  
(`add(tmp_label);`も必要です)

[code]

        public CardLabel(ImageIcon open_icon, ImageIcon revers_icon, int number) {
            this.open_icon = open_icon;
            this.reverse_icon = revers_icon;
            this.number = number;
    
            setIcon(revers_icon);
        }
    
[/code]


CC BY-SA 4.0
2021-08-12T02:23:56.313
80734
2021-08-12T02:23:56.313
2808
80723
answer