重画不更新?

时间:2013-04-25 03:03:01

标签: java swing jpanel repaint mouselistener

截至目前,我正在尝试创建一个我的老师称为“单身人士”的JAVA版本的uno。目前,我只是试图找到一个工作套牌,我可以在其中删除卡片。

我目前的问题是,当我删除一张卡时,没有任何更新。它根本不重绘。我不知道为什么。

这是Panel和Frame类。

面板:

package singles;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;
import java.awt.event.MouseMotionListener;
/**
 *
 * @author Xenorosth
 */

public class CardPanel extends JPanel{
    private Card myCard; //To get information for card
    //private static Deck myDeck = new Deck(); //Get a deck!
    public CardPanel(Card myOtherCard){
        this.setSize(100,150);
        this.setPreferredSize(new Dimension(100,150));
        myCard = myOtherCard;
        //myCard = myDeck.getMainCard(0);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g); 
        g.setColor(Color.black); //Set word drawings to black

        if(myCard.isFlipped()){
            if(myCard.getColor() == "red"){
                this.setBackground(Color.red);
                g.drawString(myCard.getValue(), 30, 30);
            }
            else if(myCard.getColor() == "green"){
                 this.setBackground(Color.green);
                 g.drawString(myCard.getValue(), 30, 30);
            }
            else if(myCard.getColor() == "blue"){
                 this.setBackground(Color.blue);
                 g.drawString(myCard.getValue(), 30, 30);
            }
            else if(myCard.getColor() == "yellow"){
                 this.setBackground(Color.yellow);
                 g.drawString(myCard.getValue(), 30, 30);
            }
            else if(myCard.getColor() == "black"){
            this.setBackground(Color.black);
            g.setColor(Color.white);
            g.drawString(myCard.getValue(), 30, 30);
            g.setColor(Color.black);      
            }
        }
        else{
        this.setBackground(Color.black);
         g.setColor(Color.white);
         g.drawString("Singles", 30, 30);
         g.setColor(Color.black);  

        }


    }

    /**
     * @return the myCard
     */
    public Card getMyCard() {
        return myCard;
    }

    /**
     * @param myCard the myCard to set
     */
    public void setMyC`enter code here`ard(Card myCard) {
        this.myCard = myCard;
    }

}

框:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package singles;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;


/**
 *
 * @author Xenorosth
 */
public class SinglesFrame extends JFrame implements MouseListener, MouseMotionListener{

    Deck myDeck = new Deck();
    CardPanel myTopMain = new CardPanel(myDeck.getMainCard(0)); //Top card of main deck
    CardPanel myTopUsed = new CardPanel(myDeck.getMainCard(1)); //Top card of used deck
    JLabel myLabel1 = new JLabel();


    public SinglesFrame(){
        setLayout(new FlowLayout(FlowLayout.CENTER));
       // myLabel1.setText(myDeck.getMainDeckLength() + "");
        myTopMain.addMouseListener(this);
        this.add(myTopMain);
        this.add(myTopUsed);
        this.add(myLabel1);

    }

    @Override
    public void mouseClicked(MouseEvent e) {
          myDeck.addUsedCard(myDeck.getMainCard(0));
          myDeck.removeMainCard(0);
          this.repaint();
          System.out.println(myDeck.getMainCard(0).toString());
    }

    @Override
    public void mousePressed(MouseEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
       // throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    //    throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseExited(MouseEvent e) {
       // throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseDragged(MouseEvent e) {
       // throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseMoved(MouseEvent e) {
       // throw new UnsupportedOperationException("Not supported yet.");
    }

}

1 个答案:

答案 0 :(得分:1)

让我们从这里开始......

CardPanel myTopMain = new CardPanel(myDeck.getMainCard(0));
CardPanel myTopUsed = new CardPanel(myDeck.getMainCard(1));

您创建了CardPanel的两个实例。每个面板都会传递一个Card

的引用

然后在你mouseClicked事件中,你这样做......

myDeck.addUsedCard(myDeck.getMainCard(0));
myDeck.removeMainCard(0);
this.repaint();
System.out.println(myDeck.getMainCard(0).toString());

您已更改Deck,但两个Card指向的CardPanel引用未发生变化。

你需要打电话(类似于)setMyCard并传入下一张要显示的卡片或null

您可能遇到的下一个问题是paintComponent方法不允许使用null Card