私は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枚すべてのカードの境界チェックを行う必要があるため、このアイデアは好きではありません。