カードゲームのジン・ルミーを作っています。私はグラフィックに取り組んでおり、具体的には、更新するパネルを作成して、プレイヤーの手のカード オブジェクトのベクトルを常に表示するようにしています。カード自体は、キャンバス クラスを拡張するコンポーネントです。私が求めているのは、プレイヤーの手 (Card オブジェクトのベクトル) が変化したときにパネルを更新する関数 updatePanel() を作成する方法です。私が考えることができるのは、GUI フレームから古いパネルを取り外し、新しいパネルを作成し、その新しいパネルにプレイヤーの手札のカードを入れてから、その新しいパネルを GUI フレームに貼り付けることだけです。GUIフレームからコンポーネントを取り外してから元に戻すと、レイアウトが乱れるリスクがあり、毎回新しいパネルを作成するのは悪い考えだと直感したため、これをコーディングしていません. だから私は'
また、selectButton の actionPerformed() メソッドが不完全であることにも気付くでしょう。私がやろうとしているのは、フォーカスを持つカードを取り除くことです。フォーカス イベントとアクション イベントの仕組みは理解していますが、パネルを検索して選択されているカードを見つけて削除する方法がわかりません。
updatePanel() または selectButton の actionPerformed() メソッドに関するヘルプ、またはプログラムの過程でパネルからオブジェクトを追加および削除するためのその他の有用な情報をいただければ幸いです。
// GraphicGinRumy
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Vector;
import java.util.Random;
public class GraphicGinRumy extends GUIFrame {
protected Card card;
protected Button selectButton, newGameButton;
protected Panel controlPanel, playerPanel;
protected RandomCardDeck deck;
protected Vector<Card> playerHand;
//Pardon this weird indentation...the code didn't copy to stack overflow correctly
public GraphicGinRumy() {
super("Gin Rumy");
deck = new RandomCardDeck();
playerHand = new Vector<Card>();
MouseListener ml = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
Card selectedCard = (Card) e.getSource();
if (selectedCard.getFocused()) {
selectedCard.setFocused(false);
} else {
selectedCard.setFocused(true);
}
}
};
deck.shuffle();
rumyDeal();
//Player Panel
playerPanel = new Panel();
for (int c = 0; c < playerHand.size(); c++) {
playerPanel.add(playerHand.elementAt(c));
}
add(playerPanel, BorderLayout.CENTER);
//Control Panel
controlPanel = new Panel();
selectButton = new Button("Select");
selectButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
controlPanel.add(selectButton);
newGameButton = new Button("New Game");
newGameButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
deck.shuffle();
deck.deal();
updatePanel();
}
});
controlPanel.add(newGameButton);
add(controlPanel, BorderLayout.SOUTH);
setSize(500, 100);
setVisible(true);
//__________________________________________________________________
//Game Setup
//__________________________________________________________________
//Set card values:
//2 to 9 is worth 5 pts; 10 to K is worth 10 pts; A is worth 15 pts
for (int c = 0; c < deck.getNumCards(); c++) {
card = deck.getCard(c);
if (card.getFaceValue() < 10) {
card.setValue(5);
} else if (card.getFaceValue() < Card.ACE) {
card.setValue(10);
} else {
card.setValue(15);
}
}
}
public static void main(String args[]) {
GraphicGinRumy rumy = new GraphicGinRumy();
//rumy.play();
}
protected void rumyDeal() {
//Give player and CPU 7 cards and add 1 to the discardPile
Card card;
int numCards = 7;
for (int i = 0; i < numCards; i++) {
playerHand.add(deck.deal());
}
for (int i = 0; i < numCards; i++) {
card = deck.deal();
card.setVisible(true);
cpuHand.add(card);
}
discardPile.add(deck.deal());
}
protected void updatePanel() {
playerPanel = new Panel();
}
}