2

私はJavaでカードゲームに取り組んでいます。私はすでに自分自身をペイントする方法を知っているカードクラスを持っています。ユーザーがカードをクリックしたときに、カードにそのランクとスーツを出力させたいのですが。残念ながら、この機能の実装に問題があります。

これが私がこれまでに持っているもののスリム化されたバージョンです:

public class Card  extends Component {

  private Rank rank;
  private Suit suit;
  // Note: Rank and Suit are enums

  public String toString() {
    String rank = this.rank.name().toLowerCase();
    String suit = this.suit.name().toLowerCase();

    return (rank + " of " + suit);
  }

  // ...
}

public class MyPanel extends JPanel implements MouseListener {

  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(410, 320);
    frame.setContentPane(new MyPanel());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }

  private Card card;

  public MyPanel() {
    card = new Card();

    card.setRank(Rank.ACE);
    card.setSuit(Suit.SPADE);
    card.addMouseListener(this);

    addMouseListener(this);
  }

  @Override
  public void mouseClicked(MouseEvent mouseEvent) {    
    Object source = mouseEvent.getSource();

    if(source instanceof Card) {
      Card card = (Card) source;
      System.out.println(card);
    }
    else {
      System.out.println("not a card : " + source);
    }
  }

  // ...
}

addMouseListenerだけが本当に必要であり、それはComponentクラスから継承されているため、JLabelから拡張したくありません。

または、Componentから拡張する代わりに、Cardクラス自体にMouseEventの場所がCardイメージの境界内にあるかどうかをチェックさせることもできます。52枚すべてのカードの境界チェックを行う必要があるため、このアイデアは好きではありません。

4

0 に答える 0