2017-04-22 3 views
0

ブラックジャックゲームを作成していて、ユーザーがボタンをクリックするたびにJFrameを更新する必要があります。ただし、フレームはで更新されていません!私は何時間もこれを無駄にしようとしました。JFrameのトラブルシューティングでのGUIのリロード

イメージをロードするために使用するオブジェクトImageIconのスタックに基づいて、フレーム内のすべての要素を適切に再ロードするにはどうすればよいですか?あなたのdrawGUI();メソッドの最後にrevalidate();repaint();を呼び出す必要が

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

は、ここに私のコードです。これはトリックを行う必要があります。これは前に答えている

SOただし、次を参照してください。Java Swing revalidate and repaintこの(作業)mcveについて

+0

あなたは何時間も私を救ってくれました。ありがとう! –

+0

この方法の最後にどうしたらいいですか?なぜ前に? –

+0

実際には、 'revalidate'する必要があります。Swingに通知するための' removeAll'を実行した後、パネルは「ダーティ」と呼ばれ、レイアウトマネージャがレイアウトを再計算できるようにコンポーネントを読み込んだ後に 'repaint'を呼び出す必要があります。再び。それで、本当に最後になる必要はありません。 – skubski

2

方法:

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); 
    } 
} 
関連する問題