如何更改此Java Applet以使用JPanel?

时间:2012-05-01 14:57:09

标签: java swing applet awt jpanel

如何将其更改为JPanel,此代码在Java Applet中如何更改?

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.lang.reflect.Array;
public class Hangman extends Applet implements ActionListener{

        static final int DEAD=13;   // amount of errors till loss
        private int errors;        // amount of errors
        private String message;   // error or victorie
        private String information; // information of the message
        private String rword;      // the rword
        private StringBuffer gword;// the gword
        private Button bStart;      // Button "Restart"
        private Button bGo;         // Button "Go"
        private TextField tfLetter; // letter box
        private Font fnt;           // common font

        public void init(){

        fnt = new Font( "Monospaced", 20, 20 );
        setFont(fnt);

                // Create textbox for guess letter

                tfLetter = new TextField();
                // Create buttons and labels

                bStart = new Button("Restart");
                bGo = new Button("Go");
                // Add the graphical elements to the applet

                add(bStart);
                add(new Label("Guess a letter:"));
                add(tfLetter);
                add(bGo);

                // Buttons are events:
                bStart.addActionListener(this);
                bGo.addActionListener(this);

                // Start first game
                initGame();
        }

        public void initGame(){

        /* Setting the errors to 0 */
                errors=0;


        /* Enter the wordslist, separated by a | here: */
                String str = "computer|radio|calculator|teacher|bureau|police|geometry|president|subject|country|enviroment|classroom|animals|province|month|politics|puzzle|instrument|kitchen|language|vampire|ghost|solution|service|software|virus25|security|phonenumber|expert|website|agreement|support|compatibility|advanced|search|triathlon|immediately|encyclopedia|endurance|distance|nature|history|organization|international|championship|government|popularity|thousand|feature|wetsuit|fitness|legendary|variation|equal|approximately|segment|priority|physics|branche|science|mathematics|lightning|dispersion|accelerator|detector|terminology|design|operation|foundation|application|prediction|reference|measurement|concept|perspective|overview|position|airplane|symmetry|dimension|toxic|algebra|illustration|classic|verification|citation|unusual|resource|analysis|license|comedy|screenplay|production|release|emphasis|director|trademark|vehicle|aircraft|experiment";
                String[] temp;

                /* delimiter */
                String delimiter = "\\|";

                /* given string will be split by the argument delimiter provided. */
                temp = str.split(delimiter);

        /* Setting the seed */
        Random randomGenerator = new Random();

        /* Generating random number */
        int randomInt = randomGenerator.nextInt(temp.length);
                rword = new String(temp[randomInt]);
                char positions[] = new char[rword.length()];
                for (int i=0; i<rword.length(); i++) {
                        positions[i] = '.';
                }
                String s = new String(positions);
                gword = new StringBuffer(s);
                tfLetter.setText("");

                // Delete the messages
                message="";
                information = "";
                repaint();
        }
        public void paint(Graphics g) {


                // Draw the hangman
                int baseY = 250;

                if (errors >  0){    // ground
                        g.drawLine(90, baseY,200,baseY);
                }
                if (errors >  1){    // bar up
                        g.drawLine(125,baseY,125,baseY-100);
                }
                if (errors >  2){
                        g.drawLine(110,baseY,125,baseY-15);
                }
                if (errors >  3){
                        g.drawLine(140,baseY,125,baseY-15);
                }
                if (errors >  4){    // side bar
                        g.drawLine(125,baseY-100,175,baseY-100);
                }
                if (errors >  5){
                        g.drawLine(125,baseY-85,140,baseY-100);
                }
                if (errors >  6){    // rope
                        g.drawLine(175,baseY-100,175,baseY-75);
                }
                if (errors >  7){    // body
                        g.drawOval(170,baseY-75,10,12);
                }
                if (errors >  8){
                        g.drawOval(170,baseY-65,15,25);
                }
                if (errors >  9){    // arms
                        g.drawLine(160,baseY-65,170,baseY-60);
                }
                if (errors > 10){
                        g.drawLine(183,baseY-60,193,baseY-65);
                }
                if (errors > 11){    // legs
                        g.drawLine(165,baseY-30,170,baseY-45);
                }
                if (errors > 12){
                        g.drawLine(183,baseY-45,193,baseY-30);
                }

                // Show the messages
                g.drawString( message, 40, baseY+25 );
                g.drawString( information, 25, baseY+45 );
                g.drawString( new String (gword), 110, 60);

        }

        public void actionPerformed(ActionEvent e){
                if (e.getSource() == bStart){
                        initGame();
                }
                if (e.getSource() == bGo){
                        processTurn();
                        // Delete the letter input box
                        tfLetter.setText("");
                        repaint();
                }
        }
        private void processTurn(){
                String s, t;
                char a;

                s = tfLetter.getText();
                a = s.charAt(0);

                if (!Character.isLetter(a)){
                          message="Only enter letters!";
                          return;
                }
                if (s.length()>1){
                          message="One letter at a time!";
                          return;
                }

                // Has the letter been guessed

                t = new String(gword);
                if (t.indexOf(s) != -1){
                        message="Letter has already been guessed";
                        return;
                }

                // If the letter doesn't occur in the rword

                if (rword.indexOf(s) == -1){
                        message="";
                        errors++;
                        if (errors==DEAD){
                                message="You lost!";
                                information = 
                                      "Click on restart for another chance!";
                        }

                        return;
                }

                // Replace dots in gword with the found letter.

                for (int i=0; i<rword.length(); i++){
                        if (rword.charAt(i) == a){
                                gword.setCharAt(i, a);
                        }
                }
                t = new String(gword);

                // If all the dots have been filled, you win

                if (t.indexOf('.') == -1){
                        message="You win!";
                        return;
                }

                // Delete message

                message="";
                repaint();
        }
}

2 个答案:

答案 0 :(得分:1)

替换此行:

public class Hangman extends Applet implements ActionListener{

通过以下方式:

public class Hangman extends JPanel implements ActionListener{

Applet扩展了扩展Container的Panel。 JPanel也间接地扩展了Container。方法add()在容器中声明。

所以,你唯一需要做的就是自己打电话给init()。当applet是java插件时,这个方法被java插件调用。

JPanel yourGame = new Hangman(); yourGame.init();

顺便说一句,你甚至不必让你的游戏扩展JPanel。你想在单独的框架中运行它?在这种情况下,请执行以下操作:

Frame f - new Frame();
Panel yourGame = new Hangman();
yourGame.init();
f.add(yourGame);
f.setSize(300, 300);
f.setVisible(true);

就是这样。这将创建框架并将您的applet(即面板)放在框架的中间。

答案 1 :(得分:1)

查看无数小变化的代码。请注意,我从游戏中删除了第二个按钮,而是将动作侦听器直接添加到文本字段中。

Hangman game

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;
import java.lang.reflect.Array;

public class Hangman extends JPanel implements ActionListener{

    static final int DEAD=13;   // amount of errors till loss
    private int errors;        // amount of errors
    private String message;   // error or victorie
    private String information; // information of the message
    private String rword;      // the rword
    private StringBuffer gword;// the gword
    private JButton bStart;      // Button "Restart"
    private JTextField tfLetter; // letter box
    private Font fnt;           // common font

    Hangman() {

        fnt = new Font( "Monospaced", 20, 20 );
        setFont(fnt);

        // Create textbox for guess letter
        tfLetter = new JTextField(4);
        // Create buttons and labels

        bStart = new JButton("Restart");
        //bGo = new JButton("Go");
        // Add the graphical elements to the applet

        setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
        add(bStart);
        add(new JLabel("Guess a letter:"));
        add(tfLetter);

        // Buttons are events:
        bStart.addActionListener(this);
        tfLetter.addActionListener(this);

        validate();

        // Start first game
        initGame();
        setPreferredSize(new Dimension(300,300));
    }

    public void initGame(){

        /* Setting the errors to 0 */
        errors=0;


        /* Enter the wordslist, separated by a | here: */
        String str = "computer|radio|calculator|teacher|bureau|police|geometry|president|subject|country|enviroment|classroom|animals|province|month|politics|puzzle|instrument|kitchen|language|vampire|ghost|solution|service|software|virus25|security|phonenumber|expert|website|agreement|support|compatibility|advanced|search|triathlon|immediately|encyclopedia|endurance|distance|nature|history|organization|international|championship|government|popularity|thousand|feature|wetsuit|fitness|legendary|variation|equal|approximately|segment|priority|physics|branche|science|mathematics|lightning|dispersion|accelerator|detector|terminology|design|operation|foundation|application|prediction|reference|measurement|concept|perspective|overview|position|airplane|symmetry|dimension|toxic|algebra|illustration|classic|verification|citation|unusual|resource|analysis|license|comedy|screenplay|production|release|emphasis|director|trademark|vehicle|aircraft|experiment";
        String[] temp;

        /* delimiter */
        String delimiter = "\\|";

        /* given string will be split by the argument delimiter provided. */
        temp = str.split(delimiter);

        /* Setting the seed */
        Random randomGenerator = new Random();

        /* Generating random number */
        int randomInt = randomGenerator.nextInt(temp.length);
        rword = new String(temp[randomInt]);
        char positions[] = new char[rword.length()];
        for (int i=0; i<rword.length(); i++) {
                positions[i] = '.';
        }
        String s = new String(positions);
        gword = new StringBuffer(s);
        tfLetter.setText("");

        // Delete the messages
        message="";
        information = "";
        repaint();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);


        // Draw the hangman
        int baseY = 250;

        if (errors >  0){    // ground
                g.drawLine(90, baseY,200,baseY);
        }
        if (errors >  1){    // bar up
                g.drawLine(125,baseY,125,baseY-100);
        }
        if (errors >  2){
                g.drawLine(110,baseY,125,baseY-15);
        }
        if (errors >  3){
                g.drawLine(140,baseY,125,baseY-15);
        }
        if (errors >  4){    // side bar
                g.drawLine(125,baseY-100,175,baseY-100);
        }
        if (errors >  5){
                g.drawLine(125,baseY-85,140,baseY-100);
        }
        if (errors >  6){    // rope
                g.drawLine(175,baseY-100,175,baseY-75);
        }
        if (errors >  7){    // body
                g.drawOval(170,baseY-75,10,12);
        }
        if (errors >  8){
                g.drawOval(170,baseY-65,15,25);
        }
        if (errors >  9){    // arms
                g.drawLine(160,baseY-65,170,baseY-60);
        }
        if (errors > 10){
                g.drawLine(183,baseY-60,193,baseY-65);
        }
        if (errors > 11){    // legs
                g.drawLine(165,baseY-30,170,baseY-45);
        }
        if (errors > 12){
                g.drawLine(183,baseY-45,193,baseY-30);
        }

        // Show the messages
        g.drawString( message, 40, baseY+25 );
        g.drawString( information, 25, baseY+45 );
        g.drawString( new String (gword), 110, 60);

    }

    public void actionPerformed(ActionEvent e){
        if (e.getSource() == bStart){
            initGame();
        }
        if (e.getSource().equals(tfLetter)){
            processTurn();
            // Delete the letter input box
            tfLetter.setText("");
            repaint();
        }
    }
    private void processTurn(){
        String s, t;
        char a;

        s = tfLetter.getText();
        a = s.charAt(0);

        if (!Character.isLetter(a)){
                  message="Only enter letters!";
                  return;
        }
        if (s.length()>1){
                  message="One letter at a time!";
                  return;
        }

        // Has the letter been guessed

        t = new String(gword);
        if (t.indexOf(s) != -1){
                message="Letter has already been guessed";
                return;
        }

        // If the letter doesn't occur in the rword

        if (rword.indexOf(s) == -1){
                message="";
                errors++;
                if (errors==DEAD){
                        message="You lost!";
                        information =
                              "Click on restart for another chance!";
                }

                return;
        }

        // Replace dots in gword with the found letter.

        for (int i=0; i<rword.length(); i++){
                if (rword.charAt(i) == a){
                        gword.setCharAt(i, a);
                }
        }
        t = new String(gword);

        // If all the dots have been filled, you win

        if (t.indexOf('.') == -1){
                message="You win!";
                return;
        }

        // Delete message

        message="";
            repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel hangman = new Hangman();
                JOptionPane.showMessageDialog(null, hangman);
            }
        });
    }
}