简体   繁体   English

我的 GUI 无法识别我的实例方法。 我怎样才能解决这个问题?

[英]My GUI is not recognizing my instance method. How can I fix this?

1) I can not call my instance method in the GUI 1) 我无法在 GUI 中调用我的实例方法

2) I can not implement a specific feature. 2)我无法实现特定功能。

I have two basic problems.我有两个基本问题。 First of all, I need my GUI to recognize my instance method (namely, when I call my isWin method in my GUI, the method is not recognized, "symbol can not be found").首先,我需要我的 GUI 来识别我的实例方法(即,当我在我的 GUI 中调用我的 isWin 方法时,无法识别该方法,“找不到符号”)。

My other problem is in the execution of a specific feature.我的另一个问题是执行特定功能。 If my fighter is a WaterFighter then he should be able to beat a FireFighter up to three levels higher.如果我的战士是 WaterFighter,那么他应该能够击败最高三个级别的 FireFighter。 so a level 8 waterfighter should beat a level 10 firefighter.所以一个8级的水兵应该打败一个10级的消防员。 I have no clue how to implement this feature.我不知道如何实现这个功能。

I tried to put it in the isWin method that whatever opposing character is passed in should drop three levels if the waterfighter calls the method and that if the fighter who calls isWin is FireFighter then the fighter who called it should drop 3 level to give the opposition an advantage.我试图将它放在 isWin 方法中,如果 waterfighter 调用该方法,则传入的任何敌对角色都应降低三级,如果调用 isWin 的战斗机是 FireFighter,则调用它的战斗机应降低 3 级以给予对手一个优势。 But this clearly does not work because what if I get a firefighter verses another fireFighter?但这显然行不通,因为如果我让一名消防员与另一名消防员进行对比会怎样? Then one of the fighters has an unfair advantage.然后其中一名战士具有不公平的优势。

//my interface //我的界面

   package OOPFight;

import java.util.ArrayList;

public interface Character {

    public boolean isWin(Character c);

    public String getName();

    public int getLevel();

    public String toString();

}

//my superclass fighter //我的超级战斗机

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

}

//my subclass WaterFighter //我的子类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

//my subclass FireFighter //我的子类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

//my Gui //我的桂

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                   



}

//end code //结束代码

I expect that I can properly call my isWin method in my GUI class and that I can properly implement the feature where there is a differene in ability where a WaterFighter can beat a FireFighter that is 3 levels higher.我希望我可以在我的 GUI 类中正确调用我的 isWin 方法,并且我可以正确实现功能不同的功能,其中 WaterFighter 可以击败高 3 个级别的 FireFighter。 So a level 8 waterfighter can beat a level 10 firefighter.所以一个 8 级的水兵可以打败一个 10 级的消防员。

So, after much digging, the problem comes down to this line ...因此,经过多次挖掘,问题归结为这一行......

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

This generates the error这会产生错误

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

The problem with this can be traced back to how you are declaring allFighters ...与此有关的问题可以追溯到您如何声明allFighters ...

public static ArrayList allFighters = new ArrayList();

By default, ArrayList can manage any type of Object , so when you call get , it is returning an instance Object , which obviously does not have a isWin method.默认情况下, ArrayList可以管理任何类型的Object ,因此当您调用get ,它返回一个实例Object ,它显然没有isWin方法。

You could cast the result of get , but a simpler solution is to take advantage of Java's inbuilt generic support.您可以转换get的结果,但更简单的解决方案是利用 Java 的内置泛型支持。

Now, because all your fighter types derive from Character , you can simply constraint the allFighters ArrayList to Character , something like...现在,因为您所有的战斗机类型都源自Character ,您可以简单地将allFighters ArrayList约束为Character ,例如...

public static ArrayList<Character> allFighters = new ArrayList<>();

This places a compile time constraint which ensures that allFighters only ever contains instances of Character这放置了一个编译时间限制,以确保allFighters只包含Character实例

Take a look at Generics for more details.查看泛型以获取更多详细信息。

You should also become familiar with the Java Language Coding Conventions .您还应该熟悉Java 语言编码约定 It will make it easier for people to read your code and for you to read other peoples code它将使人们更容易阅读您的代码,并使您更容易阅读其他人的代码

To help with your battle mechanism, first thing you should do is to create correct classes when initiating fighter.为了帮助您的战斗机制,您应该做的第一件事是在启动战斗机时创建正确的类。 Maybe implement something like this in createFighterActionPerformed:也许在 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);

To make that fighter comparison reality, you could use instance of clause in each fighters isWin class to check for specific opponent.为了使战斗机比较成为现实,您可以在每个战斗机 isWin 类中使用 instance of 子句来检查特定对手。 Like:喜欢:

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

I'd also advice you to reconsider naming an interface as Character, since it is easily messed up with java.lang.Character class.我还建议您重新考虑将接口命名为 Character,因为它很容易与 java.lang.Character 类混淆。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 当我从 main 方法调用我的 JFrame 子类时,我得到一个空白 JFrame。 我该如何解决? - I get a blank JFrame when i call my the JFrame subclass from the main method. How can I fix? 如何修复我的sortData和compareTo方法。 我一直收到“无法转换为错误”。 - How do I fix my sortData and compareTo method. I keep receiving “cannot be converted to error.” 如何修复我的 toString 方法中的输出? - How can I fix my output in my toString method? 如何使此方法在循环中更新GUI? - How can I make this method update the GUI within my loop? 如何修复队列的“删除”方法 - How can I fix my queue's “remove” method 我的联合方法不起作用,如何解决? - My Union Method is not working, How can I fix it? 如何在我的GUI上显示我的颜色图标? - How can I get my Color Icon to display on my GUI? 如何修复我的播放器和其他对象之间的崩溃方法/碰撞检测? - How can I fix my crash method/collision detection between my player and other objects? 不能使用控制台方法。 我怎样才能使用它? - Cannot use console method. How can I use it? 我正在尝试创建一个小的GUI应用程序,但是JFrame的内容没有显示在屏幕上。 如何修复我的代码? - I'm attempting to create a small GUI application, but the contents of the JFrame are not showing on screen. How can I fix my code?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM