Label wordt soms wel en soms niet bijgewerkt in applet - lokaal werkt het wel

Status
Niet open voor verdere reacties.

evertVB

Gebruiker
Lid geworden
6 apr 2009
Berichten
570
Ik heb de volgende applet:

(Staat hier online - even doorklikken naar applet)

Code:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class MastermindApplet extends javax.swing.JApplet implements ActionListener {

    JTextField[] txtGuessPattern = new JTextField[MastermindBackend.maxNumberOfTurns];
    JTextField[] txtGuessFeedback = new JTextField[MastermindBackend.maxNumberOfTurns];
    JTextField txtCodePattern = new JTextField(MastermindBackend.lengthOfPattern);
    JLabel lblActionResponse = new JLabel("Welcome",JLabel.CENTER);

    JButton btnNewEngineKeyGame = new JButton("Engine key game");
    JButton btnNewUserKeyGame = new JButton("User key game");
    JButton btnProceedAction = new JButton(" ==> ");

    JPanel pnlMain = new JPanel();
    JPanel pnlCodePattern = new JPanel();
    JPanel pnlGuessesResponses = new JPanel();
    JPanel pnlGameControl = new JPanel();
    BoxLayout lytMain = new BoxLayout(pnlMain,BoxLayout.Y_AXIS);
    FlowLayout lytCodePattern = new FlowLayout(FlowLayout.CENTER,10,10);
    GridLayout lytGuessesResponses = new GridLayout(MastermindBackend.maxNumberOfTurns,2,10,10);
    FlowLayout lytGameControl = new FlowLayout(FlowLayout.CENTER,10,10);

    MastermindBackend mmb = new MastermindBackend();
    
    public void init() {
        setLookAndFeel();
        setSize(400,650);
        
        add(pnlMain);
        
        pnlMain.setLayout(lytMain);
        pnlMain.setSize(this.WIDTH,this.HEIGHT);
        
        pnlMain.add(pnlCodePattern);
        pnlMain.add(pnlGuessesResponses);
        pnlMain.add(pnlGameControl);
        
        
        pnlCodePattern.setLayout(lytCodePattern);
        pnlCodePattern.setSize(250, 30);
        pnlGuessesResponses.setLayout(lytGuessesResponses);
        pnlGuessesResponses.setSize(250,500);
        pnlGameControl.setLayout(lytGameControl);
        pnlGameControl.setSize(250,75);
        
        pnlGameControl.add(btnNewEngineKeyGame);
        pnlGameControl.add(btnNewUserKeyGame);
        pnlGameControl.add(btnProceedAction);
        pnlGameControl.add(lblActionResponse);
        
        btnNewEngineKeyGame.addActionListener(this);
        btnNewUserKeyGame.addActionListener(this);
        btnProceedAction.addActionListener(this);
        
        pnlCodePattern.add(txtCodePattern);
        txtCodePattern.setText(mmb.getSecretKeyDisplay());
        txtCodePattern.setEnabled(false);
        
        
        for (int i = 0;i < MastermindBackend.maxNumberOfTurns; i++) {
            txtGuessPattern[i] = new JTextField(MastermindBackend.lengthOfPattern);
            pnlGuessesResponses.add(txtGuessPattern[i]);
            txtGuessFeedback[i] = new JTextField(MastermindBackend.lengthOfPattern);
            pnlGuessesResponses.add(txtGuessFeedback[i]);
        }
        setVisible(true);//LIJKT ME OVERBODIG MAAR JA
    }

    public void ClearTextboxes() {
        for (int i = 0;i < MastermindBackend.maxNumberOfTurns; i++) {
            txtGuessPattern[i].setText("");
            txtGuessFeedback[i].setText("");
        }
    }

    public void DisableTextboxes() {
        for (int i = 0;i < MastermindBackend.maxNumberOfTurns; i++) {
            txtGuessPattern[i].setEnabled(false);
            txtGuessFeedback[i].setEnabled(false);
        }
    }
    
    public void startUserKeyGameUI() {
        ClearTextboxes();
        DisableTextboxes();
        mmb.startUserKeyGame();
        txtCodePattern.setText("");
        txtCodePattern.setEnabled(true);
        lblActionResponse.setText("Enter your key, or enter " + mmb.getSecretKeyDisplay() + " if you don't want to enter it.");
    }
    
    public void processUserKeyUI() {
        String strUserKey = txtCodePattern.getText();
        if (mmb.processUserKey(strUserKey)) {
            txtCodePattern.setEnabled(false);
            int g = mmb.getNumberOfGuessesDone();
                    //at this point engine has done one guess!!
            txtGuessPattern[g - 1].setText(mmb.getTurnGuess(g - 1));
            txtGuessFeedback[g - 1].setEnabled(true);
            lblActionResponse.setText("Enter your feedback");
        } else {
          lblActionResponse.setText("Invalid key format");
        }
    }
    
    public void processUserFeedbackUI() {
        int g = mmb.getNumberOfGuessesDone();
        String strUserFeedback = txtGuessFeedback[g - 1].getText();
        if (mmb.processUserFeedback(strUserFeedback) == true) {
            txtGuessFeedback[g - 1].setEnabled(false);
            if (g < MastermindBackend.maxNumberOfTurns) {
                txtGuessPattern[g].setText(mmb.getTurnGuess(g));
                txtGuessFeedback[g].setEnabled(true);
            }
            if (mmb.getGameState() == MastermindBackend.enmGameState.gstWaiting) {
                switch (mmb.getGameResult()) {
                    case grsGuessSucceeded:
                        lblActionResponse.setText("That was hard!");
                        break;
                    case grsGuessFailed:
                        lblActionResponse.setText("Congratulations! That was REALLY hard!!");
                        break;
                    case grsContradictoryResponse:
                        lblActionResponse.setText("Sorry, contradictory responses detected.");
                }
            } else {
                lblActionResponse.setText("Enter your feedback");
            }
        } else {
          lblActionResponse.setText("Invalid feedback format");
        }
    }
    
    public void startEngineKeyGameUI() {
      mmb.startEngineKeyGame();
      txtCodePattern.setText(mmb.getCurrentCodePattern());
      lblActionResponse.setText(btnNewEngineKeyGame.getText() + " started: please enter your guess");
      txtCodePattern.setEnabled(false);
      ClearTextboxes();
      DisableTextboxes();
      txtGuessPattern[mmb.getNumberOfGuessesDone()].setEnabled(true);
    }
    
    public void processUserGuessUI() {
      int g = mmb.getNumberOfGuessesDone();
      String strCurrentGuess = txtGuessPattern[g].getText();
      if (mmb.processUserGuess(strCurrentGuess) == true) {
          txtGuessFeedback[g].setText(mmb.getTurnFeedback(g));
          txtGuessPattern[g].setEnabled(false);
          if (g + 1 < MastermindBackend.maxNumberOfTurns) {
              txtGuessPattern[g + 1].setEnabled(true);
          }
              
          if (mmb.getGameState() == MastermindBackend.enmGameState.gstWaiting) {
              txtCodePattern.setText(mmb.getCurrentCodePattern());
                  
              if (mmb.getGameResult() == MastermindBackend.enmGameResult.grsGuessSucceeded) {
                  lblActionResponse.setText("Congratulations! Game over");
              } else {
                  lblActionResponse.setText("Sorry .... Game over");
              }
                  
          } else {
              lblActionResponse.setText("Please enter your guess");
          }
      } else {
          lblActionResponse.setText("Invalid guess format");
      }
    }

    public void actionPerformed(ActionEvent event) {
      Object cmdsrc = event.getSource();
      
      if (cmdsrc == btnNewEngineKeyGame) {
          startEngineKeyGameUI();
          return;
      }
      
      if (cmdsrc == btnProceedAction && mmb.getGameState() ==
                                  MastermindBackend.enmGameState.gstEngineKeyGame) {
          processUserGuessUI();
          return;
      }
      
      if (cmdsrc == btnNewUserKeyGame)  {
          startUserKeyGameUI();
          return;
      }

      if (cmdsrc == btnProceedAction && mmb.getGameState() ==
                                  MastermindBackend.enmGameState.gstWaitingForUserKey) {
          processUserKeyUI();
          return;
      }
      
      if (cmdsrc == btnProceedAction && mmb.getGameState() ==
                                  MastermindBackend.enmGameState.gstUserKeyGame) {
          processUserFeedbackUI();
          return;
      }
      repaint();
    }
    private void setLookAndFeel() {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception exc) {
            //ignore error
        }
    }
    //DO I NEED A PAINT METHOD?
    //public void paint(Graphics screen) {
    //    Graphics2D screen2D = (Graphics2D) screen;
    //}
}
Ik doe heel vaak lblActionResponse.setText("...(een message)...");
Dit werkt bijna altijd.
Maar in één specifiek scenario werkt het niet, dus de label wordt gewoon niet bijgewerkt in mijn browser.

Namelijk precies in dit gedeelte:

Code:
            if (mmb.getGameState() == MastermindBackend.enmGameState.gstWaiting) {
                switch (mmb.getGameResult()) {
                    case grsGuessSucceeded:
                        lblActionResponse.setText("That was hard!");
                        break;
                    case grsGuessFailed:
                        lblActionResponse.setText("Congratulations! That was REALLY hard!!");
                        break;
                    case grsContradictoryResponse:
                        lblActionResponse.setText("Sorry, contradictory responses detected.");
                }
            } else {
                lblActionResponse.setText("Enter your feedback");
            }

Is daar een verklaring voor? Vanuit NetBeans heb ik dit probleem niet.
 
Laatst bewerkt:
Zou het probleem misschien kunnen zijn dat mmb.getGameResult() soms geen grsGuessSucceeded, grsGuessFailed of grsContradictoryResponse teruggeeft maar een andere waarde? In dat geval zou je dat kunnen testen door een default case te maken. I.p.v. een 'case blabla:' krijg je dan 'default:'.
 
Ik wilde jouw suggestie gaan uitproberen. Maar toen dacht ik aan iets anders:
In mijn NetBeans project folder staat naast een bestand MastermindApplet.class ook een bestand MastermindApplet$1.class.
Ik dacht eerst dat dat laatste bestand overbodig zou zijn. Nu heb ik dat $1-bestand alsnog toegevoegd op de site en nu werkt het wel.

Waar is dat $1-bestand dan precies voor?
 
Laatst bewerkt:
Mooi dat het werkt.

Schijnbaar worden daar 'anonymous inner classes' in opgeslagen. Hier kan je daar meer info over vinden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan