簡體   English   中英

我的 GUI 無法識別我的實例方法。 我怎樣才能解決這個問題?

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

1) 我無法在 GUI 中調用我的實例方法

2)我無法實現特定功能。

我有兩個基本問題。 首先,我需要我的 GUI 來識別我的實例方法(即,當我在我的 GUI 中調用我的 isWin 方法時,無法識別該方法,“找不到符號”)。

我的另一個問題是執行特定功能。 如果我的戰士是 WaterFighter,那么他應該能夠擊敗最高三個級別的 FireFighter。 所以一個8級的水兵應該打敗一個10級的消防員。 我不知道如何實現這個功能。

我試圖將它放在 isWin 方法中,如果 waterfighter 調用該方法,則傳入的任何敵對角色都應降低三級,如果調用 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 可以擊敗高 3 個級別的 FireFighter。 所以一個 8 級的水兵可以打敗一個 10 級的消防員。

因此,經過多次挖掘,問題歸結為這一行......

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 ,它顯然沒有isWin方法。

您可以轉換get的結果,但更簡單的解決方案是利用 Java 的內置泛型支持。

現在,因為您所有的戰斗機類型都源自Character ,您可以簡單地將allFighters ArrayList約束為Character ,例如...

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

這放置了一個編譯時間限制,以確保allFighters只包含Character實例

查看泛型以獲取更多詳細信息。

您還應該熟悉Java 語言編碼約定 它將使人們更容易閱讀您的代碼,並使您更容易閱讀其他人的代碼

為了幫助您的戰斗機制,您應該做的第一件事是在啟動戰斗機時創建正確的類。 也許在 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 類中使用 instance of 子句來檢查特定對手。 喜歡:

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

我還建議您重新考慮將接口命名為 Character,因為它很容易與 java.lang.Character 類混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM