簡體   English   中英

如何為ActionListener實現循環和if-else邏輯?

[英]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。 這不是正確的比較。 您應該檢查選擇的類型是否與用戶的猜測相匹配。

  1. 在方法局部聲明組件變量不是首選方法,特別是當您需要使用Anonymous類的方法時,該方法需要將您的組件變量聲明為final 在類上下文中聲明組件變量。

  2. 無需使用兩個單獨的JLabel即可為正確輸入顯示YESNO 使用一個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 
  3. 您在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.

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