1

Netbeans を使用してマッチング ゲームを作成していますが、GUI エディターは使用していません (最悪です)。そこで、基本的に、JButton クラスを拡張する Card という新しいクラスを作成しました。構築時に、ボタンのサイズは 100px x 100px に設定され、アイコンが設定されます。ボタンを GridBagLayout の JPanel に追加すると、意図したサイズではありません。

これが私のコードの一部です:

JFRAME クラス:

package matchinggame;

... imports ...

public class MatchingGameWindow extends JFrame {

    Card[] cards = new Card[16]; //16 game cards

    public MatchingGameWindow() {
         ...
         //Create new game panel (for the cards)
         JPanel gamePanel = new JPanel(new GridBagLayout());
         //gamePanel.setSize(500,500); removed as it is not needed.
         ...
         this.add(gamePanel, BorderLayout.CENTER);
         //Create 16 card objects
         cards = createCards();

         //Create new grid bag constraints
         GridBagConstraints gbc = new GridBagConstraints();

         //Add the cards to the game panel
         int i=0;
         for (int y = 0; y < 4; y++) {
             gbc.gridy = y;
             for (int x = 0; x < 4; x++) {
                gbc.gridx = x;
                gamePanel.add(cards[i], gbc);
                i++;
             }
         }
    }

    public final Card[] createCards() {
        Card[] newCards = new Card[16];
        //New choices array
        ArrayList<Integer> choices = new ArrayList();
        int[] choiceValues = {0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7};
        //Add the initial choice values to the arraylist
        for (int i=0; i < choiceValues.length; i++) {
            choices.add(choiceValues[i]);
        }

        //Create 16 cards
        for (int i=0; i < 16; i++) {
            //Initial value of -1 for error checking
            int iconIndex = -1;
            //Loop until card is created
            while (iconIndex == -1) {    
                //Get a random number from 0 - 7
                Random r = new Random();
                int rInt = r.nextInt(8);
                //If the random number is one of the choices
                if (choices.contains(rInt)) {
                     //the icon # will be the random number
                     iconIndex = rInt;
                     //Get rid of that choice (it is used up)
                     choices.remove(new Integer(rInt));
                     //Create a new Card in the Card[]
                     newCards[i] = new Card(i,iconIndex);
                //If all the choices are gone
                } else if (choices.isEmpty()){
                    iconIndex = -1; //done creating this card (breaks out of loop)
                }
            }
        }
        //Return the created cards
        return newCards;
    }
}

カードクラス:

package matchinggame;

import javax.swing.ImageIcon;
import javax.swing.JButton;

public class Card extends JButton {

    final static ImageIcon defaultIcon = new ImageIcon("cardback.jpg");
    ImageIcon secretIcon;
    boolean isRevealed = false;

    ...

    public Card(final int cardIndex, int secretIconIndex) { 
        //Size is 100px by 100px            
        setSize(100, 100);
        //Default icon is card back image
        setIcon(defaultIcon);
        //Get the secret icon behind the back of the card
        secretIcon = icons[secretIconIndex];    
    }
}

そして、このコードを使用すると、次の結果が得られます。 これが結果です。

ここで私が間違っていることについてのアイデアはありますか?

編集: Hovercraft Full Of Eels が言ったように getPreferredSize メソッドをオーバーライドしましたが、うまくいきました! このコードを Card クラスに追加しました。

@Override
public Dimension getPreferredSize() {
    return new Dimension(100,100);
}

そして私の望ましい結果を得ました: 修理済み!

アイコンが正常に表示されないため、アイコンに何か問題があるに違いありません。

4

1 に答える 1

3

クラスのコンストラクターで使用するsetSize(...)のではなく、クラスのgetPreferredSize()メソッドをオーバーライドして Dimension(100, 100) を返す必要があります。setSize(...) 実際、プログラムにはno-whereが必要です。適切なレイアウト マネージャーを使用する代わりpack()に、すべてのコンポーネントを追加した後、それを表示する前に JFrame を呼び出し、レイアウト マネージャーが GUI のサイズを適切に設定できるようにします。

于 2013-02-18T22:26:51.317 に答える