![](/img/trans.png)
[英]I get a blank JFrame when i call my the JFrame subclass from the main method. How can I fix?
[英]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.