我的GUI无法识别我的实例方法.我该怎么解决这个问题



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

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

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

我的另一个问题是在执行特定功能时。如果我的战士是一名水上战士,那么他应该能够击败一名高出三级的消防员。所以一个8级的水上战斗机应该打败一个10级的消防员。我不知道如何实现这个功能。

我试着把它放在isWin方法中,如果水上战斗机调用该方法,无论对方角色是谁,都应该降低三级,如果调用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。所以一个八级水上战斗机可以打败一个十级消防员。

所以,经过大量挖掘,问题归结为这一行。。。

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,所以您可以简单地将allFightersArrayList约束为Character,类似于。。。

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

这设置了一个编译时间约束,确保allFighters只包含Character的实例

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

您还应该熟悉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类中使用子句的实例来检查特定的对手。类似:

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

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

最新更新