5
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;


public class Cards extends JFrame {

private GridLayout grid1;

    JButton []bt=new JButton[52];

    ImageIcon tail=new ImageIcon(getClass().getResource("b1fv.png"));

    ImageIcon ori;

    public Cards(){
        grid1=new GridLayout(7,9,2,2);
        setLayout(grid1);
        for(int i=0;i<bt.length;i++){
            ImageIcon c=new ImageIcon(getClass().getResource(i+1+".png"));
            bt[i]=new JButton(c);
            bt[i].addActionListener(new RatingMouseListener(i));
            add( bt[i]);
        }
    }

    public static void main(String[] args){
        Cards frame=new Cards();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1400,700);
        frame.setVisible(true);
    }

    private class RatingMouseListener implements ActionListener {
        private  int index=0;


        public RatingMouseListener(int index) {
            this.index = index;

        }




        public void actionPerformed(ActionEvent e) {
              System.out.println("Mouse entered for rating " + index);
            ori=new ImageIcon(getClass().getResource(index+1+".png"));

            if (bt[index].getIcon()==ori)
                bt[index].setIcon(tail);
             else
                bt[index].setIcon(ori);



        }

    }



}

これを実行すると、オリとテールが入れ替わるはずです。しかし、そうではありません。誰かが私を助けることができますか?

4

2 に答える 2

3

これは、説明タグを介して行うのが最適です。

基本的には以下のように画像に説明文を設定し、同じ説明文であれば差し替えます。

ori.setDescription("ori");
tail.setDescription("tail");

if ("ori".equals((ImageIcon)bt[index].getIcon()).getDescription())
// The rest is how you had it.
于 2012-11-26T01:39:22.980 に答える
2

クリックするとトランプが反転するようにしたいのではないかと思います(わかりません)。繰り返しになりますが、ImageIconを一度作成してプログラムの開始時に作成することをお勧めします。次に、equal(...)メソッドを使用するか、この状況でも演算子を使用して、あるアイコンが別のアイコンと同じであるかどうかを簡単に比較できます==。たとえば、私が言っていることの例については、このコードを見て実行してください。

import java.awt.GridLayout;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.*;

public class CardsDeck {
   public static final String RANKS = "a23456789tjqk";
   public static final String SUITS = "cdhs";
   public static final String CARDS_IMG_PATH = "http://math.hws.edu/javanotes/source/cards.png";
   private static final int BACK_RANK = 2;
   private static final int BACK_SUIT = SUITS.length();
   private static final String ICON = "icon";

   private JPanel panel = new JPanel();
   private List<ImageIcon> iconList = new ArrayList<ImageIcon>();
   private ImageIcon cardBack;

   public CardsDeck() {
      try {
         URL imgUrl = new URL(CARDS_IMG_PATH);
         BufferedImage img = ImageIO.read(imgUrl);

         double cardWidth = (double) img.getWidth() / RANKS.length();
         double cardHeight = (double) img.getHeight() / (SUITS.length() + 1);
         int w = (int) cardWidth;
         int h = (int) cardHeight;
         for (int rank = 0; rank < RANKS.length(); rank++) {
            for (int suit = 0; suit < SUITS.length(); suit++) {
               int x = (int) (rank * cardWidth);
               int y = (int) (suit * cardHeight);
               BufferedImage subImg = img.getSubimage(x, y, w, h);
               ImageIcon icon = new ImageIcon(subImg);
               iconList.add(icon);
            }
         }

         int x = (int) (BACK_RANK * cardWidth);
         int y = (int) (BACK_SUIT * cardHeight);
         BufferedImage subImg = img.getSubimage(x, y, w, h);
         cardBack = new ImageIcon(subImg);

         int hgap = 5;
         int vgap = hgap;
         panel.setLayout(new GridLayout(SUITS.length(), RANKS.length(), hgap, vgap));
         panel.setBorder(BorderFactory.createEmptyBorder(vgap, hgap, vgap, hgap));
         MouseListener mouseListener = new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
               JLabel label = (JLabel) e.getSource();
               Icon currentIcon = label.getIcon();
               if (currentIcon.equals(cardBack)) {
                  Icon icon = (Icon) label.getClientProperty(ICON);
                  label.setIcon(icon);
               } else {
                  label.setIcon(cardBack);
               }
            }
         };
         Collections.shuffle(iconList);
         for (int i = 0; i < iconList.size(); i++) {
            JLabel label = new JLabel(cardBack);
            label.putClientProperty(ICON, iconList.get(i));
            label.addMouseListener(mouseListener);
            panel.add(label);
         }
      } catch (MalformedURLException e) {
         e.printStackTrace();
         System.exit(-1);
      } catch (IOException e) {
         e.printStackTrace();
         System.exit(-1);
      }
   }

   private JComponent getPanel() {
      return panel;
   }

   private static void createAndShowGui() {
      CardsDeck cardsDeck = new CardsDeck();

      JFrame frame = new JFrame("CardsDeck");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(cardsDeck.getPanel());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

実行すると、13 x 4のカードの配列が表示され、それらをクリックして裏返すことができます。

ここに画像の説明を入力してください

于 2012-11-26T03:27:06.580 に答える