2016-05-04 13 views
1

こんにちは私は自分のクラップスプログラムの側面にサイコロ画像を追加しようとしています。しかし私はすべて私のJLabelsJtextfeildsおよびJButtonsが消えてしまう問題に取り組んでいます。JAppletのダイス画像の表示に問題があります

ダイス画像:

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

*は、この方法は、できるだけ早くこのコンポーネントのpaintメソッドを呼び出します。 **そうでなければ、このメソッドは 'Component#repaint' JavaDocからできるだけ早く**このコンポーネントの更新メソッドを呼び出します。 –

+0

*コンポーネント**の更新メソッドは、このコンポーネントのペイントメソッド**を呼び出して、このコンポーネントを「コンポーネント#更新」JavaDocから再描画します。 –

+0

したがって、 'paint'の中で' repaint'を呼び出すとブラックホールが発生します。あなたは絵を描くべきではありません。それぞれのダイス画像に6つの「JLabels」、あるいは6つのダイスすべてをイメージした1つの「JLabel」が必要です。 –

答えて

1

私はあなたのコードを編集し、私が何をしたかを説明するコメントを含めると推論のためにきましたそれ。巨大な説明を書いて、コードのさまざまな部分を参照するのではなく、コード内のコードを説明する方がずっと簡単でした。

paintメソッドを削除しました。不要で、無限ループでpaintrepaintの呼び出しが行われました。

注:タイプと変数の間隔については申し訳ありませんが、私のIDEはそのように設定されています。

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; 
    } 

} 

ここでは、アプレットの実行中のスクリーンショットです:このコンポーネントが軽量コンポーネントである場合

Screenshot of the applet running.

関連する問題