2017-04-22 142 views
0

我正在創建一個二十一點遊戲,並且每次用戶單擊一個按鈕時都需要刷新JFrame。但是,框架是不更新!我試了幾個小時試圖解決這個徒勞。在JFrame問題中重新加載GUI

如何根據我用來加載圖像的堆棧ImageIcon對象正確地重新加載幀中的所有元素?

這裏是我的代碼:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Stack; 

public class Blackjack extends JFrame implements ActionListener { 
    public void drawGUI(boolean firstTime) { 
     getContentPane().removeAll(); 

     setLayout(new GridLayout(3, 9, 1, 1)); 
     updateValues(); 

     add(new JLabel(DEALER_TEXT, SwingConstants.CENTER)); 
     add(new JLabel("Value: " + computerValue, SwingConstants.CENTER)); 
     for(int i = 0; i < computerCards.size(); i++) 
      add(new JLabel(computerCards.get(i).getImagePath())); 

     leaveSpacing(false); 

     add(new JLabel(USER_TEXT, SwingConstants.CENTER)); 
     add(new JLabel("Value: " + userValue, SwingConstants.CENTER)); 
     for(int i = 0; i < userCards.size(); i++) 
      add(new JLabel(userCards.get(i).getImagePath())); 

     leaveSpacing(true); 

     if(firstTime) { 
      hitButton.addActionListener(this); 
      standButton.addActionListener(this); 
     } 

     leaveSpacing(3); 
     add(hitButton); 
     add(standButton); 
     leaveSpacing(1); 
    } 
} 
+1

TL; DR;在你瘋了之前,爲什麼不發佈[mcve]讓你更容易找出問題並獲得幫助? – c0der

+0

@ c0der感謝您的回覆。問題正在更新。在actionPerformed(ActionEvent evt)方法中,它調用drawGUI(boolean firstTime)重繪整個JFrame;但它不會刪除所有元素並進行更新。它只是保持元素相同。 –

+1

我明白這一點。我認爲這個問題可以用更短的代碼來證明。 [mcve]也意味着可編輯 – c0der

回答

2

你需要調用revalidate();repaint();drawGUI();方法結束。這應該做的伎倆。

這是回答之前SO然而,請參見:Java Swing revalidate and repaint

+0

你已經救了我無數個小時。謝謝! –

+0

在方法結束時如何做到這一點?爲什麼不在之前? –

+0

實際上,在執行'removeAll'來通知Swing之後,您需要'重新驗證',因此面板被稱爲「髒」,並且在讀取組件之後需要調用'repaint'以讓佈局管理器重新計算佈局再次。所以它並不需要最後。 – skubski

2

怎麼樣這個(工作)mcve

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingConstants; 

public class BalckJack extends JFrame implements ActionListener { 

    private JButton hitButton = new JButton("Hit"); 
    private int computerValue; 

    public static void main(String[] args) { 

     BalckJack frame = new BalckJack(); 
     frame.setTitle("Cards"); 
     frame.setSize(800, 320); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public BalckJack() { 

     computerValue = 0; 

     for(int i = 0; i < 27; i++) { 
      add(new JLabel(new ImageIcon(""))); 
     } 

     drawGUI(true); 
    } 

    public void drawGUI(boolean firstTime) { 

     getContentPane().removeAll(); 

     setLayout(new GridLayout(1, 2, 1, 1)); 

     add(new JLabel("Value: " + computerValue++, SwingConstants.CENTER)); 

     if(firstTime) { 
      hitButton.addActionListener(this); 
     } 

     add(hitButton); 
     revalidate(); //(!!!!) 
    } 

    @Override 
    public void actionPerformed(ActionEvent evt) { 

     drawGUI(false); 
    } 
}