[英]How can I implement loops and if-else logic for ActionListener?
我正在嘗試使用Swing構建一個簡單的問答游戲。 用戶應該能夠從組合框中選取一種水果或蔬菜,並猜測它是水果還是蔬菜。 如果他們猜對了,那么GUI應該輸出“是”。 如果他們猜錯了,它應該輸出“ no”。 該代碼似乎可以正確編譯,但是無法正確運行。
我在“水果”和“蔬菜”按鈕的ActionListener中使用if-else循環,以確定用戶是否正確猜測。
public class GUI {
public static String input;
public static void main(String[] args) {
new GUI();
}
public GUI()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Simple GUI");
frame.setSize(400,300);
frame.setLocationRelativeTo(null);
final String[] fruitOptions = {"Apple", "Apricot", "Banana"
,"Cherry", "Date", "Kiwi", "Orange", "Pear", "Strawberry"};
final String[] vegOptions = {"Asparagus", "Beans", "Broccoli", "Cabbage"
, "Carrot", "Celery", "Cucumber", "Leek", "Mushroom"
, "Pepper", "Radish", "Shallot", "Spinach", "Swede"
, "Turnip"};
String[] combined = {"Apple", "Apricot", "Banana"
,"Cherry", "Date","Cucumber", "Leek", "Mushroom"
, "Pepper", "Radish","Kiwi", "Orange", "Pear", "Strawberry", "Asparagus", "Beans", "Broccoli", "Cabbage"
, "Carrot", "Celery","Shallot", "Spinach", "Swede"
, "Turnip"};
JPanel comboPanel = new JPanel();
JLabel comboLabel = new JLabel("Is it a Fruit or Vegetable?:");
final JComboBox fruitsVeggies = new JComboBox(combined);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
input = (String) fruitsVeggies.getSelectedItem();
}
};
fruitsVeggies.addActionListener(actionListener);
comboPanel.add(comboLabel);
comboPanel.add(fruitsVeggies);
final JButton fruitButton = new JButton( "Fruit");
JButton vegButton = new JButton("Vegetable");
final JLabel yes = new JLabel("YES");
final JLabel no = new JLabel("NO");
ActionListener listener = new ActionListener()
{
public void actionPerformed (ActionEvent d)
{
int i;
for(i=0; i<vegOptions.length-1; i++)
{
if (input.equals(fruitOptions[i]))
{
yes.setVisible(true);
}
else
no.setVisible(true);
}
}
};
ActionListener vegListener = new ActionListener()
{
public void actionPerformed(ActionEvent f)
{
int i;
for(i=0; i<vegOptions.length-1; i++)
{
if (input.equals(fruitOptions[i]))
{
no.setVisible(true);
}
else
yes.setVisible(true);
}
}
};
no.setVisible(false);
yes.setVisible(false);
fruitButton.addActionListener(listener);
vegButton.addActionListener(vegListener);
frame.add(comboPanel, BorderLayout.NORTH);
frame.add(vegButton,BorderLayout.WEST);
frame.add(fruitButton, BorderLayout.EAST);
frame.add(yes, BorderLayout.CENTER);
frame.add(no, BorderLayout.CENTER);
frame.setVisible(true);
}
}
您的問題是以下代碼
public void actionPerformed (ActionEvent d)
{
int i;
for(i=0; i<vegOptions.length-1; i++)
{
if (input.equals(fruitOptions[i]))
{
yes.setVisible(true);
}
else
{
no.setVisible(true);
}
}
}
在循環的每次迭代中,您都在設置一個標簽的可見性。 相反,您應該在循環中檢查結果,然后再設置可見性。 同樣,您似乎只檢查輸入是否為水果,如果是,則將yes設置為visible。 這不是正確的比較。 您應該檢查選擇的類型是否與用戶的猜測相匹配。
在方法局部聲明組件變量不是首選方法,特別是當您需要使用Anonymous類的方法時,該方法需要將您的組件變量聲明為final
。 在類上下文中聲明組件變量。
無需使用兩個單獨的JLabel
即可為正確輸入顯示YES
和NO
。 使用一個JLabel
和利用setText(string)
的方法JLabel
。 當尚未做出決定時,請使用resultNo answer is chosen
或類似的resultNo answer is chosen
對您有意義。 例如:
answerLabel = new JLabel("No answer is chosen"); // answerLabel is a JLabel declared in class context
您在actionPerformed
函數中有錯誤,如下所示:
public void actionPerformed (ActionEvent d) { int i; for(i=0; i<vegOptions.length-1; i++) { if (input.equals(fruitOptions[i])) //<---i is bounded to vegOptions length //but iterating over fruitOptions !! answerLabel.setText("YES! Correct Answer"); else answerLabel.setText("NO! Wrong Answer"); } }
和其他動作組件類似的更改,即兩個JButton
for(i=0; i<vegOptions.length-1; i++)
{
if (input.equals(fruitOptions[i]))
yes.setVisible(true);
else
no.setVisible(true);
}
該代碼是錯誤的。
正如Sage提到的,第一個問題是vegOptions.length-1
應該是fruitOptions.length
您要檢查的是水果,而不是蔬菜。
最初,其他問題可能並不明顯。 假設用戶輸入“蘋果”。 該代碼對照“ apple”(來自fruitOptions)檢查“ apple”(其輸入),並顯示“ yes”標簽。 然后,代碼針對“杏”(來自fruitOptions)檢查“蘋果”(其輸入),並顯示“否”標簽。 循環之后,“是”和“否”標簽都將可見。
此代碼應該起作用。 確保您了解其工作原理:
boolean isInArray = false;
for(i=0; i<fruitOptions.length; i++)
{
if (input.equals(fruitOptions[i]))
{
isInArray = true;
}
}
if(isInArray)
{
yes.setVisible(true);
no.setVisible(false);
}
else
{
no.setVisible(true);
yes.setVisible(false);
}
請注意,這兩個問題都與ActionListener無關。
同樣正如Sage所指出的,當您可以擁有兩個JLabel並更改其上的文本時,就不需要兩個JLabel。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.