0

さて、私はしばらくJavaでこのメモリゲームアプレットに取り組んでおり、すべてのソートおよびマッチングアルゴリズムをすべて理解しました.GUIを適切に機能させようとして惨めな時間を過ごしています. 「カード」の 1 つをクリックして「フリップ」すると、カードの列が作成され、カーソルでその上に移動するまで、カードの下に対応するカードが残ります。なぜこれが起こっているのか、どうすればそれを止めることができるのかよくわからないので、すべてが非常にイライラしています. これが私の表示クラスです:

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.*;

public class Display extends JPanel implements MouseListener {

private String[] Colors = Card.validColors();
private String[] Shapes = Card.validShapes();
private Component[] place;
private JButton[][] buttonGrid= new JButton[6][6];
private Rectangle[][] triggers = new Rectangle[6][6];
private Board game;
private Polygon star = new Polygon();
private Card pick;
private boolean turnPhase2 = false;
private Font serifNames = new Font(Font.SERIF, Font.PLAIN, 18);
private Font serifCards = new Font(Font.SERIF, Font.ROMAN_BASELINE, 36);
private JPanel panel = new JPanel();

public Display() {
    this.setBackground(Color.BLACK);
    this.setLayout(new GridBagLayout());
    panel.setSize(590, 410);
    panel.setLayout(new GridLayout(6, 6, 10, 10));
    panel.setOpaque(false);

    generateStar();
    buildBoard();
    fillButtonArray();

    this.addMouseListener(this);
    this.add(panel);
    System.out.println(getFontMetrics(serifCards));
    System.out.println(getFontMetrics(serifNames));
}



public void paintComponent(Graphics g) {
    super.paintComponent(g);
    place = panel.getComponents();
    for (int i = 0; i < place.length; i++) {
        paintBack(g, place[i].getX() + 25, place[i].getY() + 35);
    }
    displayNames(g);
    displayTurn(g);
    if (game.flippedCard() != null) {
        int[] xy = game.flippedCardLocation();
        paintCard(g, game.flippedCard(), xy[0], xy[1]);
    }
}

/**
 * This method builds the game board.
 * 
 * 
 */
private void buildBoard() {
    game = new Board(buildDeck());
}

/**
 * This method creates a "deck" of cards with which we can create the game board.
 * 
 * @return deck Returns the deck of Card objects in the form of an ArrayList.
 */
private ArrayList<Card> buildDeck() {
    ArrayList<Card> deck = new ArrayList<Card>();

    for (int i = 0; i < Colors.length; i++) {
        for (int s = 0; s < Shapes.length; s++) {
            Card first = new Card(Shapes[s], Colors[i]);
            Card second = new Card(Shapes[s], Colors[i]);
            deck.add(first);
            deck.add(second);
        }
    }
    System.out.println(deck.size());
    return deck;
}

private void fillButtonArray() {
    for (int i = 0; i < 6; i++) {
        for (int n = 0; n < 6; n++) {
            JButton button = new JButton();
            button.setPreferredSize(new Dimension(90, 60));
            button.addMouseListener(this);
            button.setOpaque(false);
            button.setContentAreaFilled(false);
            button.setBorderPainted(false);

            buttonGrid[i][n] = button;
        }
    }
    fillGrid();
}

private void fillGrid() {
    panel.setBounds(25, 35, panel.getSize().width, panel.getSize().height);
    int count = 0;
    for (int i = 0; i < 6; i++) {
        for (int s = 0; s < 6; s++) {
            panel.add(buttonGrid[i][s]);
            place = panel.getComponents();
            int x = panel.getComponent(count).getBounds().x;
            int y = panel.getComponent(count).getBounds().y;
            Rectangle rect = new Rectangle(x, y, 90, 60);
            triggers[i][s] = rect;
        }
    }

}

private void paintBack(Graphics g, int x, int y) {
    g.setColor(Color.WHITE);
    g.drawRoundRect(x, y, 90, 60, 2, 4);
    g.fillRoundRect(x, y, 90, 60, 2, 4);
    g.setColor(Color.BLACK);
    g.setFont(serifCards);
    g.drawString("M", x + 28, y + 42);
}

private void paintCard(Graphics g, Card card, int x, int y) {
    g.setColor(Color.GRAY);
    g.drawRoundRect(x, y, 90, 60, 2, 4);
    g.fillRoundRect(x, y, 90, 60, 2, 4);
    String color = card.getColor();
    String shape = card.getShape();

    if (shape.equals("Star")) {
        g.setColor(pickColor(color));
        star.translate(x + 25, y + 10);
        g.drawPolygon(star);
        g.fillPolygon(star);

    }
    else if (shape.equals("Circle")) {
        g.setColor(pickColor(color));
        g.drawOval(x + 25, y + 10, 40, 40);
        g.fillOval(x + 25, y + 10, 40, 40);
    }
    else if (shape.equals("Square")) {
        g.setColor(pickColor(color));
        g.drawRect(x + 25, y + 10, 40, 40);
        g.fillRect(x + 25, y + 10, 40, 40);
    }
}



private void displayNames(Graphics g) {
    g.setFont(serifNames);
    int[] scores = game.getCurrentScores();

    for (int i = 0; i < scores.length; i++) {
        if (i == 0) {
            g.setColor(Color.CYAN);
            g.drawString("Cyan: " + scores[i], 10, 24);
        }
        else if (i == 1) {
            g.setColor(Color.ORANGE);
            g.drawString("Orange: " + scores[i], 560, 24);
        }
        else if (i == 2) {
            g.setColor(Color.MAGENTA);
            g.drawString("Magenta: " + scores[i], 10, 470);
        }
        else {
            g.setColor(Color.WHITE);
            g.drawString("White: " + scores[i], 569, 470);
        }
    }
}

private void displayTurn(Graphics g) {
    int player = game.getCurrentPlayer();

    if (player == 0) {
        g.setColor(Color.CYAN);
        String str = "Cyan's Turn";
        g.drawString(str, 640 / 2 - 48, 24);
        //System.out.println(getFontMetrics(serifNames).stringWidth(str) / 2 + " Cyan");
    }
    else if (player == 1) {
        g.setColor(Color.ORANGE);
        String str = "Orange's Turn";
        g.drawString(str, 640 / 2 - 52, 24);
        //System.out.println(getFontMetrics(serifNames).stringWidth(str) / 2 + " Orange");
    }
    else if (player == 2) {
        g.setColor(Color.MAGENTA);
        String str = "Magenta's Turn";
        g.drawString(str, 640 / 2 - 57, 24);
        //System.out.println(getFontMetrics(serifNames).stringWidth(str) / 2 + " Magenta");
    }
    else {
        g.setColor(Color.WHITE);
        String str = "White's Turn";
        g.drawString(str, 640 / 2 - 47, 24);
        //System.out.println(getFontMetrics(serifNames).stringWidth(str) / 2 + " White");
    }
}

private void findTrigger(int x, int y) {
    for (int i = 0; i < 6; i++) {
        if () {

        }
        for (int s = 0; s < 6; s++) {
            Rectangle rectTest = triggers[i][s];
            if (x >= rectTest.getMinX() &&
                    x <= rectTest.getMaxX() &&
                    y >= rectTest.getMinY() &&
                    y <= rectTest.getMaxY()) {
                Graphics g = getGraphics();
                paintCard(g, game.flip(i,s), buttonGrid[i][s].getBounds().x, buttonGrid[i][s].getBounds().y);
                break;
            }
        }
    }
}

private void generateStar() {
    star.addPoint(20, 0);
    star.addPoint(25, 15);
    star.addPoint(40, 15);
    star.addPoint(28, 24);
    star.addPoint(32, 40);
    star.addPoint(20, 30);
    star.addPoint(8, 40);
    star.addPoint(12, 24);
    star.addPoint(0, 15);
    star.addPoint(15, 15);
}

private Color pickColor(String color) {
    if (color.equals("Black")) {
        return Color.BLACK;
    }
    if (color.equals("Yellow")) {
        return Color.YELLOW;
    }
    if (color.equals("Green")) {
        return Color.GREEN;
    }
    if (color.equals("Blue")) {
        return Color.BLUE;
    }
    if (color.equals("Red")) {
        return Color.RED;
    }
    if (color.equals("Purple")) {
        return new Color(128, 0, 255);
    }
    return null;
}

@Override
public void mouseClicked(MouseEvent e) {
    System.out.println("Mouse Clicked");
    int x = e.getX();
    System.out.println(x + " is x");
    int y = e.getY();
    System.out.println(y + " is Y");
    System.out.println(panel.getWidth() + 25);
    System.out.println(panel.getHeight() + 35);

    System.out.println("Finding the trigger rectangle");
    findTrigger(x, y);
}

@Override
public void mouseEntered(MouseEvent e) {
    //System.out.println("Mouse Entered");
}

@Override
public void mouseExited(MouseEvent e) {
    //System.out.println("Mouse Exited");
}

@Override
public void mousePressed(MouseEvent e) {
    System.out.println("Mouse Pressed");
}

@Override
public void mouseReleased(MouseEvent e) {
    System.out.println("Mouse Released");
}

}

実際のゲームはボード オブジェクトによって処理され、マルチプレイヤー メモリ ゲームを作成して実行するために必要なすべてのメソッドがあり、Card オブジェクトには、ゲームで一致させる形状と色の 2 つの文字列しか含まれていないことを補足します。 . そして最後のクラスは、私が提供する Memory クラスです。

import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JApplet;

public class Memory extends JApplet {
private Display _theDisplay;
final int width = 640;
final int height = 480;

private Action reDraw = new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
        repaint();
    }
};

public Memory() {
    _theDisplay = new Display();
}

public void init() {
    setSize(width, height);
    setBackground(Color.BLACK);
    this.add(_theDisplay);
}

}

事前に感謝します。

4

1 に答える 1

4

グラフィックが乱れているように見えます。私が見る問題:

  • Graphics コンテキストで描画するコンポーネントを呼び出しますgetGraphics()が、この方法で取得された Graphics オブジェクトは保持されないため、混乱したり、NPE がスローされる可能性があることを理解してください。
  • メソッドを介してすべてパッシブなグラフィックスを実行することをお勧めしますpaintComponent(...)paintComponent(...)事前に作成された描画が必要な場合は、BufferedImages でこれらを行い、JComponent のメソッドで BufferedImages を描画します。
  • Display JPanel にカードと裏面のすべてのペイントを行わせるのではなく、各カードを独自の状態を持つ個別のオブジェクトにし、その状態に応じて正しくペイントすることをお勧めします。これを JComponent に拡張したり、Display JPanel によって描画される論理エンティティにしたりすることは自由ですが、ロジックを表示から分離して、コーディングとデバッグを簡素化することができます。
  • あなたの方法に大きな問題があるようで、findTrigger(...)そこに集中して取り組むべきです。カードrepaint()paintComponent(...).
  • それ以外の場合は、カード自体が描画される場合は、それらを JLabels にして、単純に ImageIcon を交換することを検討してください。これは、おそらくカードを「反転」する最も簡単な方法です。
  • あなたの主な問題は、プログラムの誤動作です。コードの簡単な概要でこの原因を確認したことはありません。デバッガーまたは println ステートメントを使用して、何よりもまず問題を特定することをお勧めします。
于 2013-08-18T18:00:08.137 に答える