2016-05-04 11 views
1

Hallo, ich versuche, Würfelbilder an der Seite meines Craps-Programms hinzuzufügen. Allerdings laufe ich immer wieder auf das Problem von allen meinen JLabels, Jtextfeilds und JButtons verschwindenden.Probleme bei der Anzeige von Würfelbildern in einem JApplet

Dice Bilder:

Craps.java:

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class Craps extends JApplet implements ActionListener{ 

    private static final long serialVersionUID = 1L; 

    //constant variables for the status of the game 
    final int WON = 0,LOST =1, CONTINUE = 2; 

    //other variables used in the program 
    boolean firstRoll = true; 
    int sumOfDice = 0; 
    int myPoint = 0; 
    int gameStatus = CONTINUE; 
    int numberHouseWins = 0; 
    int numberPlayerWins = 0; 
    String divider = "*******"; 

    int die1,die2,workSum; 
    //die faces 
    Image dieFace1,dieFace2,dieFace3,dieFace4,dieFace5,dieFace6; 

    //graphical user interface components 
    JLabel dieLabel1, dieLabel2, sumLabel, rollLabel, pointLabel; 
    JLabel lblHouseWins, lblPlayerWins; 
    JLabel leftDivider, rightDivider; 
    JTextField firstDie, secondDie, sum, point; 
    JTextField txtHouseWins, txtPlayerWins; 
    JButton roll; 



    public void paint(Graphics g){ 


     if(die1 == 1){ 
      repaint(); 
      g.drawImage(dieFace1, 0, 0, this); 
     } 
     else if(die1 == 2){ 
      repaint(); 
      g.drawImage(dieFace2, 0, 0, this); 
     } 
     else if(die1 == 3){ 
      repaint(); 
      g.drawImage(dieFace3, 0, 0, this); 
     } 
     else if(die1 == 4){ 
      repaint(); 
      g.drawImage(dieFace4, 0, 0, this); 
     } 
     else if(die1 == 5){ 
      repaint(); 
      g.drawImage(dieFace5, 0, 0, this); 
     } 
     else if(die1 == 6){ 
      repaint(); 
      g.drawImage(dieFace6, 0, 0, this); 
     } 
     if (die2==1){ 
      repaint(); 
      g.drawImage(dieFace1, 0, 30, this); 
     }else if(die2 == 2){ 
      repaint(); 
      g.drawImage(dieFace2, 0, 30, this); 
     } 
     else if(die2 == 3){ 
      repaint(); 
      g.drawImage(dieFace3, 0, 30, this); 
     } 
     else if(die2 == 4){ 
      repaint(); 
      g.drawImage(dieFace4, 0, 30, this); 
     } 
     else if(die2 == 5){ 
      repaint(); 
      g.drawImage(dieFace5, 0, 30, this); 
     } 
     else if(die2 == 6){ 
      repaint(); 
      g.drawImage(dieFace6, 0, 30, this); 
     } 

    } 
    public void init() 
    { 
     //setup graphical user interface components 
     JPanel display = new JPanel(); 
     display.setLayout(new GridLayout(8, 2, 10, 10)); 



     //creating JLabel Die1 to the display 
     dieLabel1 = new JLabel("Die 1:",SwingConstants.RIGHT); 
     display.add(dieLabel1); 
     firstDie = new JTextField(3); 
     firstDie.setEditable(false); 
     display.add(firstDie); 

     //creating JLabel Die2 to the Display 
     dieLabel2 = new JLabel("Die 2:",SwingConstants.RIGHT); 
     display.add(dieLabel2); 
     secondDie = new JTextField(3); 
     secondDie.setEditable(false); 
     display.add(secondDie); 

     //creating JLabel sum die to the display 
     sumLabel = new JLabel("Their sum is:",SwingConstants.RIGHT); 
     display.add(sumLabel); 
     sum = new JTextField(4); 
     sum.setEditable(false); 
     display.add(sum); 

     //creating JLabel rollLabel to the display 
     rollLabel= new JLabel("Roll Again",SwingConstants.RIGHT); 
     display.add(rollLabel); 
     roll = new JButton("Roll Dice"); 
     roll.addActionListener(this); 
     display.add(roll); 

     //creating JLabel pointLabel to the display 
     pointLabel = new JLabel("Point is:",SwingConstants.RIGHT); 
     display.add(pointLabel); 
     point = new JTextField(3); 
     point.setEditable(false); 
     display.add(point); 

     //creating JLabel leftDivider and rightDivider to the display 
     leftDivider = new JLabel(divider,SwingConstants.RIGHT); 
     display.add(leftDivider); 
     rightDivider = new JLabel(divider,SwingConstants.LEFT); 
     display.add(rightDivider); 

     //creating JLabel lblPlayerWins and JTextField txtPlayerWins to the display 
     lblPlayerWins = new JLabel("Player wins:",SwingConstants.RIGHT); 
     display.add(lblPlayerWins); 
     txtPlayerWins = new JTextField(4); 
     txtPlayerWins.setEnabled(false); 
     display.add(txtPlayerWins); 

     //creating JLabel lblHouseWins and JTextField txtHouseWins to the display 
     lblHouseWins = new JLabel("House wins:",SwingConstants.RIGHT); 
     display.add(lblHouseWins); 
     txtHouseWins = new JTextField(4); 
     txtHouseWins.setEnabled(false); 
     display.add(txtHouseWins); 
     setContentPane(display); 
     dieFace1=getImage(getDocumentBase(),"die1.jpg"); 
     dieFace2=getImage(getDocumentBase(), "die2.jpg"); 
     dieFace3=getImage(getDocumentBase(),"die3.jpg"); 
     dieFace4=getImage(getDocumentBase(), "die4.jpg"); 
     dieFace5=getImage(getDocumentBase(),"die5.jpg"); 
     dieFace6=getImage(getDocumentBase(), "die6.jpg"); 
    } 

    public void actionPerformed(ActionEvent e){ 
     play(); 

    } 

    public void play(){ 
     if(firstRoll){ 
      sumOfDice = rollDice(); 

      switch (sumOfDice) { 
      //player wins on first roll 
      case 7: case 11: 
       gameStatus = WON; 
       point.setText(""); 
       break; 

      //house wins player loses on first roll 
      case 2:case 3: case 12: 
       gameStatus = LOST; 
       point.setText(""); 
       break; 

      default: 
       gameStatus = CONTINUE; 
       myPoint = sumOfDice; 
       point.setText(Integer.toString(myPoint)); 
       firstRoll = false; 
       break; 
      } 
     } 

     else{ 
      sumOfDice = rollDice(); 

      if(sumOfDice==myPoint) 
       gameStatus = WON; 
      else 
       if(sumOfDice == 7) 
        gameStatus = LOST; 
     } 
     if(gameStatus == CONTINUE) 
      showStatus("Roll again"); 
     else{ 
      if(gameStatus == WON){ 
       showStatus("Player wins."+"Click Roll Dice to play again"); 
       numberPlayerWins++; 
       txtPlayerWins.setText(Integer.toString(numberPlayerWins)); 

      } 
      else{ 
       showStatus("House wins."+"Click Roll Dice to play again"); 
       numberHouseWins++; 
       txtHouseWins.setText(Integer.toString(numberHouseWins)); 
       } 
      firstRoll = true; 
     } 
    } 

    public int rollDice(){ 


     die1 = 1+ (int)(Math.random()*6); 
     die2 = 1+ (int)(Math.random()*6); 
     workSum = die1 +die2; 

     firstDie.setText(Integer.toString(die1)); 
     secondDie.setText(Integer.toString(die2)); 
     sum.setText(Integer.toString(workSum)); 

     return workSum; 
    } 




} 
+0

* Wenn diese Komponente ein Leichtbauteil ist, diese Methode einen Aufruf bewirkt, dass diese Farbe Methode der Komponente so schnell wie möglich. ** Andernfalls führt diese Methode so schnell wie möglich zu einem Aufruf der Aktualisierungsmethode dieser Komponente **. * - aus dem JavaDoc der Java-Komponente "Komponenten # Repaint". –

+0

* Die Update-Methode von Component ** ruft die Paint-Methode dieser Komponente auf **, um diese Komponente neu zu zeichnen. * - von der 'Component # update' JavaDoc. –

+0

Wenn Sie 'repaint' in' paint' aufrufen, erscheint ein schwarzes Loch. Du solltest nicht malen, du solltest entweder 6 'JLabels' für jedes Würfelbild haben oder 1'JLabel' mit einem Bild von allen 6 Würfeln. –

Antwort

1

Ich habe den Code bearbeitet und auch die Kommentare zu erklären, was ich tat, und die Begründung für es. Es war viel einfacher, den Code im Code zu erklären, als eine große Erklärung zu schreiben und auf verschiedene Teile des Codes zu verweisen.

Ich entfernte Ihre paint Methode, wie es nicht benötigt wurde und endlos zwischen paint und repaint Anrufe geloopt.

Hinweis: Sorry über den Abstand zwischen Typen und Variablen, meine IDE ist so eingerichtet.

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

import javax.swing.ImageIcon; 
import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingConstants; 

public class Craps extends JApplet implements ActionListener { 

    private static final long serialVersionUID = 1L; 

    // constant variables for the status of the game 
    final int     WON     = 0, LOST = 1, CONTINUE = 2; 

    // other variables used in the program 
    boolean      firstRoll   = true; 
    int       sumOfDice   = 0; 
    int       myPoint    = 0; 
    int       gameStatus   = CONTINUE; 
    int       numberHouseWins  = 0; 
    int       numberPlayerWins = 0; 
    String      divider    = "*******"; 

    int       die1, die2, workSum; 

    // graphical user interface components 
    JLabel      dieLabel1, dieLabel2, sumLabel, rollLabel, pointLabel; 
    JLabel      lblHouseWins, lblPlayerWins; 
    JLabel      leftDivider, rightDivider; 
    JTextField     firstDie, secondDie, sum, point; 
    JTextField     txtHouseWins, txtPlayerWins; 
    JButton      roll; 

    // added these two JLabels to display dice ImageIcons 
    JLabel      dieImg1, dieImg2; 
    // die faces, changed to an array of ImageIcons 
    ImageIcon     dieFaces[]; 


    // moved these into their own function, init is pretty stuffed 
    public void createImageIcons() { 
     // create an array of ImageIcons, easier to set JLabels image using 
     // index rather than 6 if-else-if statements 
     dieFaces = new ImageIcon[6]; 

     dieFaces[0] = new ImageIcon(getImage(getDocumentBase(), "die1.jpg")); 
     dieFaces[1] = new ImageIcon(getImage(getDocumentBase(), "die2.jpg")); 
     dieFaces[2] = new ImageIcon(getImage(getDocumentBase(), "die3.jpg")); 
     dieFaces[3] = new ImageIcon(getImage(getDocumentBase(), "die4.jpg")); 
     dieFaces[4] = new ImageIcon(getImage(getDocumentBase(), "die5.jpg")); 
     dieFaces[5] = new ImageIcon(getImage(getDocumentBase(), "die6.jpg")); 
    } 


    public JPanel createTxtImgContainer(JTextField txt, JLabel img) { 
     JPanel container = new JPanel(); 
     container.setLayout(new GridLayout(1, 2, 10, 10)); 

     txt.setEditable(false); 

     container.add(txt); 
     container.add(img); 

     return container; 
    } 


    @Override 
    public void init() { 
     // don't know if this is necessary, but it can't hurt 
     super.init(); 

     // let's load the images first, no need to run a bunch of code and then 
     // error out on image loading also we can use the ImageIcons after this 
     createImageIcons(); 

     // setup graphical user interface components 
     JPanel display = new JPanel(); 
     display.setLayout(new GridLayout(8, 2, 10, 20)); 

     // creating JLabel Die1 to the display 
     dieLabel1 = new JLabel("Die 1:", SwingConstants.RIGHT); 
     display.add(dieLabel1); 

     firstDie = new JTextField(3); 
     // created dieImg1 here also set the initial ImageIcon to "die6.jpg" 
     dieImg1 = new JLabel(dieFaces[5]); 
     // create a JPanel to house the JTextField and JLabel, and it to display 
     display.add(createTxtImgContainer(firstDie, dieImg1)); 

     // creating JLabel Die2 to the Display 
     dieLabel2 = new JLabel("Die 2:", SwingConstants.RIGHT); 
     display.add(dieLabel2); 

     secondDie = new JTextField(3); 
     // created dieImg2 here also set the initial image to "die6.jpg" 
     dieImg2 = new JLabel(dieFaces[5]); 
     // create a JPanel to house the JTextField and JLabel, and it to display 
     display.add(createTxtImgContainer(secondDie, dieImg2)); 

     // creating JLabel sum die to the display 
     sumLabel = new JLabel("Their sum is:", SwingConstants.RIGHT); 
     display.add(sumLabel); 
     sum = new JTextField(4); 
     sum.setEditable(false); 
     display.add(sum); 

     // creating JLabel rollLabel to the display 
     rollLabel = new JLabel("Roll Again", SwingConstants.RIGHT); 
     display.add(rollLabel); 
     roll = new JButton("Roll Dice"); 
     roll.addActionListener(this); 
     display.add(roll); 

     // creating JLabel pointLabel to the display 
     pointLabel = new JLabel("Point is:", SwingConstants.RIGHT); 
     display.add(pointLabel); 
     point = new JTextField(3); 
     point.setEditable(false); 
     display.add(point); 

     // creating JLabel leftDivider and rightDivider to the display 
     leftDivider = new JLabel(divider, SwingConstants.RIGHT); 
     display.add(leftDivider); 
     rightDivider = new JLabel(divider, SwingConstants.LEFT); 
     display.add(rightDivider); 

     // creating JLabel lblPlayerWins and JTextField txtPlayerWins to the 
     // display 
     lblPlayerWins = new JLabel("Player wins:", SwingConstants.RIGHT); 
     display.add(lblPlayerWins); 
     txtPlayerWins = new JTextField(4); 
     txtPlayerWins.setEnabled(false); 
     display.add(txtPlayerWins); 

     // creating JLabel lblHouseWins and JTextField txtHouseWins to the 
     // display 
     lblHouseWins = new JLabel("House wins:", SwingConstants.RIGHT); 
     display.add(lblHouseWins); 
     txtHouseWins = new JTextField(4); 
     txtHouseWins.setEnabled(false); 
     display.add(txtHouseWins); 

     setContentPane(display); 
    } 


    @Override 
    public void actionPerformed(ActionEvent e) { 
     play(); 

    } 


    public void play() { 
     if (firstRoll) { 
      sumOfDice = rollDice(); 

      switch(sumOfDice) { 
      // player wins on first roll 
       case 7 : 
       case 11 : 
        gameStatus = WON; 
        point.setText(""); 
        break; 

       // house wins player loses on first roll 
       case 2 : 
       case 3 : 
       case 12 : 
        gameStatus = LOST; 
        point.setText(""); 
        break; 

       default: 
        gameStatus = CONTINUE; 
        myPoint = sumOfDice; 
        point.setText(Integer.toString(myPoint)); 
        firstRoll = false; 
        break; 
      } 
     } 

     else { 
      sumOfDice = rollDice(); 

      if (sumOfDice == myPoint) { 
       gameStatus = WON; 
      } else if (sumOfDice == 7) { 
       gameStatus = LOST; 
      } 
     } 
     if (gameStatus == CONTINUE) { 
      showStatus("Roll again"); 
     } else { 
      if (gameStatus == WON) { 
       showStatus("Player wins." + "Click Roll Dice to play again"); 
       numberPlayerWins++; 
       txtPlayerWins.setText(Integer.toString(numberPlayerWins)); 

      } else { 
       showStatus("House wins." + "Click Roll Dice to play again"); 
       numberHouseWins++; 
       txtHouseWins.setText(Integer.toString(numberHouseWins)); 
      } 
      firstRoll = true; 
     } 
    } 


    public int rollDice() { 

     die1 = 1 + (int) (Math.random() * 6); 
     die2 = 1 + (int) (Math.random() * 6); 
     workSum = die1 + die2; 

     firstDie.setText(Integer.toString(die1)); 
     secondDie.setText(Integer.toString(die2)); 
     sum.setText(Integer.toString(workSum)); 

     // set dieImgs to die values - 1, because the array starts at 0 not 1 
     dieImg1.setIcon(dieFaces[die1 - 1]); 
     dieImg2.setIcon(dieFaces[die2 - 1]); 

     return workSum; 
    } 

} 

Hier ist ein Screenshot des Applets läuft:

Screenshot of the applet running.