无法在JApplet中显示骰子图像

时间:2016-05-04 04:00:57

标签: java swing japplet

您好我试图在我的掷骰程序一侧添加骰子图像。但是,我一直遇到JLabelsJtextfeildsJButtons消失的问题。

骰子图片:

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




}

1 个答案:

答案 0 :(得分: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.