問題の原因となっている行は正確にわかっていますが、スタック トレース エラーが表示されていないため、デバッグが必要です。私が抱えている問題は、パネルに焦点が合っていないと思ったことです。最初に開いたとき、パネルは空白で描画されていませんが、最小化して復元すると、パネルが描画されます。panel.requestFocus()
画面描画前に初期化しているクラスのコンストラクタにandをつけてみpanel.requestFocusInWindow()
たのですが、どうにもならないみたいです。コードは次のとおりです。
JPanel クラス:
package blackjack;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Board extends JPanel {
int dealer = 0;
int player = 0;
int money = 2500;
Deck deck;
Player p = new Player();
public Board() {
deck = new Deck(false, this); //if I comment this out, the panel gets painted straight away
}
public void paint(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillRect(0,0,getWidth(),getHeight());
repaint();
}
}
そして、問題を引き起こしているクラス:
package blackjack;
import java.awt.Image;
import java.util.Random;
import javax.swing.ImageIcon;
public class Deck {
Card[] deck = new Card[52];
int[] used = new int[52];
Random r = new Random();
public Deck(boolean shuffle, Board b) {
int i = 0;
for(int x=0; x<51; x++) {
used[x] = -1;
}
for(Cards card : Cards.values()) {
if(card.getId() != 53) {
Image image = new ImageIcon(this.getClass().getResource(card.getImagePath())).getImage();
deck[i] = new Card(card.getId(),card.getValue(),image);
i = i+1;
}
}
if(shuffle) shuffle();
b.requestFocus();
b.requestFocusInWindow();
}
public void shuffle() {
Card[] shuffled = new Card[52];
for(int x=0; x<51; x++) {
int i = pickNotUsed();
if(i==-1) break;
shuffled[x] = deck[i];
}
deck = shuffled;
}
private int pickNotUsed() {
int notpicked = r.nextInt(52);
for(int x=0; x<51; x++) {
if(used[x] != notpicked) {
return notpicked;
}
}
return -1;
}
public Card[] getCards() {
return deck;
}
public Card drawCard() {
for(int x=0; x<deck.length; x++) {
if(deck[x] != null) {
return deck[x];
}
}
return null;
}
}
元のクラスは、JFrame パッケージのブラックジャックを拡張します。
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class Blackjack extends JFrame {
public static void main(String[] args) {
new Blackjack();
}
public Blackjack() {
setSize(1000,600);
setTitle("Blackjack");
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
add(new Board());
}
}