重新绘制LinkedStack中的值不起作用

时间:2016-04-24 12:16:00

标签: java user-interface canvas

我正在制作游戏,每当我要按下新游戏按钮时,我的画布都不会更新,但我的LinkedStack值已经更新。据推测,它已经改变了LinkedStack值。

[编辑]

- 在我的代码中添加了一些部分,我的代码中的主要问题是每当我按下新游戏时,节点都会显示正确的新值,但每当它传递给paint(g)(或repaint() ),节点仍然存在第一个值。

这是我的画布代码的一部分。 (此类扩展了Canvas)

public class Solitaire extends Canvas{
public Solitaire(){
    setSize(width, height);
    //initializes specific LinkedStacks
    //creates "cards"
}
public void paint(Graphics g){
    Graphics2D g2d = (Graphics2D) g;
    g.setColor(Color.WHITE);
    g.clearRect(0, 0, width, height);
    g.setColor(Color.BLACK);
    paintSolitaire(g2d);
}
public void paintSolitaire(Graphics2D g2d){
    int i=0;
    int move=0;
    LinkedStack temp=null;

    ypos=0;
    xpos=30;
    while(i!=7){
        ypos=220;
        move=30;
        temp=new LinkedStack();
        while(tableau[i].peek()!=null){
            temp.push(tableau[i].pop());
        }

        if(temp.peek()==null){
            g2d.drawRect(xpos, ypos, 70, 95);
        }
        else{
            tableauNode=temp.checkTop();
            while(tableauNode!=null){
                Card card=(Card)tableauNode.data;
                if(card.getFaceUp()==true){
                    ypos=ypos+move;
                    g2d.drawImage(getImage("Deck/"+card.getImage()+".png"), xpos, ypos, 70, 95, null);
                }
                else if(card.getFaceUp()==false){
                    ypos=ypos+move;
                    g2d.drawImage(getImage("Deck/155.png"), xpos, ypos, 70, 95, null);
                }
                else{
                    break;
                }
                tableauNode=tableauNode.link;
            }
        }
        while(temp.peek()!=null){
            tableau[i].push(temp.pop());
        }
        temp=null;
        tableauNode=null;
        i++;
        xpos=xpos+100;
    }
    g2d.setFont(new Font("Dialog", Font.PLAIN, 30)); 
    g2d.drawString(occurence, 800, 125);
}
public void update(){
    repaint();
}
public void deal(){
    //deals "cards" into specific LinkedStack
}
public void shuffle(){
    //shuffles LinkedList nodes
}

这是我实现JFrame的主类的一部分。按“新游戏”后,这段代码就会执行。

public class Main extends JFrame implements ActionListener{
private Solitaire solitaire;
private JPanel panel;
public Main(){
    panel=new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(this.createMenuBar(), BorderLayout.NORTH);

    solitaire=new Solitaire();

    solitaire.shuffle();
    solitaire.deal();
    panel.add(solitaire, BorderLayout.CENTER);
    add(panel);
    pack();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    setResizable(false);
}
private JMenuBar createMenuBar(){
    JMenuBar menuBar;
    JMenu menu;
    JMenuItem newGame;
    menu=new JMenu("Menu");
    menuBar.add(menu);
    newGame=new JMenuItem("New Game");
    newGame.addActionListener(this);
    menu.add(newGame);
    return menuBar;
public void actionPerformed(ActionEvent e){
    String command=e.getActionCommand();
    switch (command){
        case "New Game":
        solitaire=new Solitaire();
        solitaire.shuffle();
        solitaire.deal();
        solitaire.update();
        break;
    }
}
public static void main (String[] args){
    Main main=new Main();
}
}

1 个答案:

答案 0 :(得分:0)

下面:

public void actionPerformed(ActionEvent e){
    String command=e.getActionCommand();
    switch (command){
        case "New Game":
        solitaire=new Solitaire();
        solitaire.shuffle();
        solitaire.deal();
        solitaire.update();
        break;
    }
}

您正在创建一个新的纸牌对象,但不会在任何地方显示它。原始纸牌对象在您的GUI中保持不变。

选项:

  • 删除原始纸牌对象并将新对象添加到GUI
  • 然后在持有它的容器上调用revalidate()repaint()
  • 更好的是,改进Solitaire,这样你就不必创建一个新的Solitaire,而只需简单地在原版上调用reset(),它就会随机播放和更新。
  • 同样,不要使用Canvas而是使用JPanel,不要覆盖paint,而是覆盖paintComponent,并调用super的绘画方法。