3

問題の原因となっている行は正確にわかっていますが、スタック トレース エラーが表示されていないため、デバッグが必要です。私が抱えている問題は、パネルに焦点が合っていないと思ったことです。最初に開いたとき、パネルは空白で描画されていませんが、最小化して復元すると、パネルが描画されます。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());
    }
}
4

1 に答える 1

0
  • 表示する前に、コンポーネントを JFrame (ボード) に追加します。
  • paintメソッドをオーバーライドしないでください。代わりに描画ロジックをpaintComponentに置きます。

UI (ルック アンド フィール) デリゲートの paint メソッドを特殊化するだけのサブクラスは、paintComponent をオーバーライドする必要があります。

  • 無限ループが発生するため、ペイント メソッドでrepaint ()を呼び出す必要はありません。Paintメソッドは、再描画が必要なときにシステムによって自動的に呼び出されるか、実際に再描画が必要なときにユーザーによって呼び出されます。
  • 動作を本当に理解するまでrequestFocusを実行しないでください。この場合、それを呼び出す意味はありません。

とにかく、この状態でもアプリケーションは最初から緑色の背景フレームを表示します。

于 2013-10-17T06:28:45.967 に答える