我的GUI无法识别我的实例方法。我该如何解决?

时间:2018-12-27 21:59:08

标签: java instance-variables instanceof

1)我无法在GUI中调用实例方法

2)我无法实现特定功能。

我有两个基本问题。首先,我需要GUI来识别我的实例方法(即,当我在GUI中调用isWin方法时,该方法无法识别,“找不到符号”)。

我的另一个问题是执行特定功能。如果我的战斗机是水战斗机,那么他应该能够击败水战斗机高达三级。因此,第8级水手应该击败第10级水手。我不知道如何实现此功能。

我试图将其放入isWin方法中,如果水兵调用该方法,则传递给对方的任何字符都应下降3级;如果调用isWin的战士为FireFighter,则调用它的战士应下降3级。给反对派一个优势。但这显然不起作用,因为如果我得到一名消防员推荐另一名消防员怎么办?然后其中一名战士有不公平的优势。

//我的界面

   package OOPFight;

import java.util.ArrayList;

public interface Character {

    public boolean isWin(Character c);

    public String getName();

    public int getLevel();

    public String toString();

}

//我的超一流战斗机

package OOPFight;

import java.util.ArrayList;

/**
 *
 * @author Owner
 */
public class fighter implements Character {



    public String name;
    public int level;
    public String type;

    public fighter(String n, int l, String t) {

        name = n;
        level = l;
        type = t;

    }

    public boolean isWin(Character c) {

        if (level > c.getLevel()) {

            return true;
        } else if (c.getLevel() > level) {

            return false;
        } else {

            int random = (int) (Math.random() * 2 + 1);

            if (random == 1) {
                return true;
            } else {

                return false;
            }
        }

    }//end iswin

    public String toString() {

        String desc;
        desc = name + ":" + level + ":" + type;
        return desc;

    }//end toString()

    public String getType() {

        return type;

    }//end toString()

    public String getName() {
        return name;
    }

    public int getLevel() {
        return level;
    }

}

//我的子类别WaterFighter

import java.util.ArrayList;


public class WaterFighter extends fighter{


    public String name;
    public int level;
    public String type;




    public WaterFighter(String n, int l, String t) {
        super(n, l, t);
    }

    public  boolean isWin(Character c){


        int level2 = c.getLevel() - 3;

        int level1 = level;

        if (level1 > level2){

            return true;

        } else if (level2 > level1){

            return false;
        } else {

              int random = (int) (Math.random() * 2 + 1);

            if (random == 1) {
                return true;
            } else {

                return false;
            }//end if

        }//end if 

    }//end isWin

}//end class

//我的子类FireFighter

package OOPFight;

import java.util.ArrayList;


public class FireFighter extends fighter{


    public String name;
    public int level;
    public String type;




    public FireFighter(String n, int l, String t) {
        super(n, l, t);
    }

    public  boolean isWin(Character c){



        int level2 = c.getLevel();

        int level1 = level - 3;

        if (level1 > level2){

            return true;

        } else if (level2 > level1){

            return false;
        } else {

              int random = (int) (Math.random() * 2 + 1);

            if (random == 1) {
                return true;
            } else {

                return false;
            }//end if

        }//end if 

    }//end isWin

}//end class

//我的桂

package OOPFight;

import java.util.ArrayList;

/**
 *
 * @author Owner
 */
public class fight extends javax.swing.JFrame {

   public static ArrayList allFighters = new ArrayList();


    /**
     * Creates new form fight
     */
    public fight() {
        initComponents();


        ArrayList allFighterTypes = new ArrayList();

        allFighterTypes.add("Water Fighter");
        allFighterTypes.add("Fire Fighter");

        for (int i = 0; i < 2;  i++){

        typesComboBox.addItem((String) allFighterTypes.get(i)); 

        }

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        nameField = new javax.swing.JTextField();
        createFighter = new javax.swing.JButton();
        jLabel4 = new javax.swing.JLabel();
        typesComboBox = new javax.swing.JComboBox<>();
        jLabel5 = new javax.swing.JLabel();
        levelField = new javax.swing.JTextField();
        jPanel2 = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        firstCombo = new javax.swing.JComboBox<>();
        jLabel6 = new javax.swing.JLabel();
        secondCombo = new javax.swing.JComboBox<>();
        jButton2 = new javax.swing.JButton();
        display = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBackground(new java.awt.Color(255, 255, 0));

        jLabel1.setFont(new java.awt.Font("Gadugi", 0, 24)); // NOI18N
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Fighter Regristration");

        jLabel3.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        jLabel3.setText("Name:");

        createFighter.setText("Create Fighter!");
        createFighter.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                createFighterActionPerformed(evt);
            }
        });

        jLabel4.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        jLabel4.setText("Type:");

        jLabel5.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        jLabel5.setText("Level:");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 357, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(jPanel1Layout.createSequentialGroup()
                            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jLabel3)
                                .addComponent(jLabel4)
                                .addComponent(jLabel5))
                            .addGap(18, 18, 18)
                            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(nameField)
                                .addComponent(typesComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(levelField))))
                    .addComponent(createFighter))
                .addContainerGap(33, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(43, 43, 43)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(47, 47, 47)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(typesComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(37, 37, 37)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel5)
                    .addComponent(levelField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(57, 57, 57)
                .addComponent(createFighter)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanel2.setBackground(new java.awt.Color(0, 255, 255));

        jLabel2.setFont(new java.awt.Font("Gadugi", 0, 24)); // NOI18N
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("Fighting Arena");

        jLabel6.setText("VS.");

        jButton2.setText("Fight!");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        display.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        display.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton2)
                .addGap(170, 170, 170))
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(display, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addComponent(firstCombo, 0, 184, Short.MAX_VALUE)
                        .addGap(33, 33, 33)
                        .addComponent(jLabel6)
                        .addGap(18, 18, 18)
                        .addComponent(secondCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(116, 116, 116)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(firstCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6)
                    .addComponent(secondCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(108, 108, 108)
                .addComponent(jButton2)
                .addGap(67, 67, 67)
                .addComponent(display, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(113, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    private void createFighterActionPerformed(java.awt.event.ActionEvent evt) {                                              

        String n = nameField.getText();
        String leveler = levelField.getText();
        int level = Integer.parseInt(leveler);
        int typer = typesComboBox.getSelectedIndex();
        String type = null;

        if (typer == 1){

            type =  "WaterFighter";

        } else if (typer == 2){
            type = "FireFighter";

        }


         allFighters.add( new fighter(n, level, type));

         firstCombo.addItem(allFighters.toString());
         secondCombo.addItem(allFighters.toString());


    }                                             

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         

        int monster1 = firstCombo.getSelectedIndex();
        int monster2 = secondCombo.getSelectedIndex();

        boolean win = allFighters.get(monster1).isWin(allFighters.get(monster2));



    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(fight.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(fight.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(fight.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(fight.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new fight().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton createFighter;
    private javax.swing.JLabel display;
    private javax.swing.JComboBox<String> firstCombo;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JTextField levelField;
    private javax.swing.JTextField nameField;
    private javax.swing.JComboBox<String> secondCombo;
    private javax.swing.JComboBox<String> typesComboBox;
    // End of variables declaration                   



}

//结束代码

我希望我可以在GUI类中正确调用isWin方法,并且可以正确实现该功能,其中在功能上存在区别,其中WaterFighter可以击败FireFighter高3级。因此,级别8的水手可以击败级别10的消防员。

2 个答案:

答案 0 :(得分:2)

因此,在进行大量挖掘之后,问题归结为这一行...

boolean win = allFighters.get(monster1).isWin(allFighters.get(monster2));

这会产生错误

fight.java:117: error: cannot find symbol
        boolean win = allFighters.get(monster1).isWin(allFighters.get(monster2));

与此相关的问题可以追溯到您如何声明allFighters ...

public static ArrayList allFighters = new ArrayList();

默认情况下,ArrayList可以管理任何类型的Object,因此,当您调用get时,它将返回一个实例Object,该实例显然没有{ {1}}方法。

您可以转换isWin的结果,但是更简单的解决方案是利用Java的内置通用支持。

现在,由于您的所有战斗机类型都源自get,因此您可以将Character allFighters约束为ArrayList,就像...

Character

这将放置一个编译时间约束,以确保public static ArrayList<Character> allFighters = new ArrayList<>(); 仅包含allFighters的实例

查看Generics了解更多详细信息。

您还应该熟悉Java Language Coding Conventions。这将使人们更容易阅读您的代码,并使您阅读其他人的代码

答案 1 :(得分:0)

为帮助您的战斗机制,您应该做的第一件事是在启动战斗机时创建正确的类。也许在createFighterActionPerformed中实现这样的事情:

int typer = typesComboBox.getSelectedIndex();
fighter f;

if (typer == 0) {
    f = new fighter(n, level, "Regular fighter");
} else if (typer == 1) {
    f = new WaterFighter(n, level, "WaterFighter");
} else if (typer == 2) {
    f = new FireFighter(n, level, "FireFighter");
}

allFighters.add(f);

要使战斗机比较成为现实,您可以在每个战斗机的isWin类中使用子句的实例来检查特定的对手。喜欢:

if (c instanceof FireFighter) {
    // Do special stuff
}

我还建议您重新考虑将接口命名为Character,因为它很容易与java.lang.Character类混淆。