Java交换机案例无法按预期运行

时间:2013-11-27 19:54:25

标签: java switch-statement

我是非常基本的Java的学生。我们做了一个赋值,根据使用几个if语句选择的单选按钮来改变背景颜色。这工作得很好。我决定将选择过程改为组合框并使用开关盒。在我看来,这个过程在switch case方法中失败了if语句。我正在努力更好地理解事情是如何运作的。代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class Lab17_4combo extends JFrame implements ActionListener
{
    Container container;
    JComboBox colors;

    public Lab17_4combo()
    {
        super("ComboBox ");
        container = this.getContentPane();
        container.setLayout(new FlowLayout());
        setSize(300,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String[] selectColor = {"Red", "Yellow", "Blue", "Green", "Magenta"};
        JComboBox colors = new JComboBox(selectColor);
        colors.setSelectedIndex(-1);
        colors.addActionListener(this);

        container.add(colors);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent e)
    {
        int chgColor;

        if(e.getSource() == colors)
        {
            chgColor = colors.getSelectedIndex();

            switch(chgColor)
            {
                case 0:
                    container.setBackground(Color.red);
                case 1:
                    container.setBackground(Color.yellow);
                case 2:
                    container.setBackground(Color.blue);
                case 3:
                    container.setBackground(Color.green);
                case 4:
                    container.setBackground(Color.magenta);
            }
        }else
            {
                container.setBackground(Color.magenta);
            }

    }
    public static void main(String[] args)
    {
        Lab17_4combo s = new Lab17_4combo();
    }
}

我放入了else来检查if是否失败了。我假设这是问题所在,但我不知道如何解决它。任何帮助将不胜感激。原来的任务已经完成,这是我自己的实验。我不是要求任何人为我做功课。干杯

修改 - 我已对代码进行了建议的更改(感谢所有建议)。无论我从组合框中做出什么选择,容器的背景颜色仍然没有变化。我假设代码中的其他地方有错误,但我找不到它们。我的期望是容器的背景颜色将根据我从组合框中做出的选择而改变。这种情况没有发生。

修订后的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class Lab17_4combo extends JFrame implements ActionListener
{
    Container container;
    JComboBox colors;

    public Lab17_4combo()
    {
        super("ComboBox ");
        container = this.getContentPane();
        container.setLayout(new FlowLayout());
        setSize(300,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String[] selectColor = {"Red", "Yellow", "Blue", "Green", "Magenta"};
        JComboBox colors = new JComboBox(selectColor);
        colors.setSelectedIndex(-1);
        colors.addActionListener(this);

        container.add(colors);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent e)
    {
        int chgColor;

        if(e.getSource() == colors)
        {
            chgColor = colors.getSelectedIndex();

            switch(chgColor)
            {
                case 0:
                    container.setBackground(Color.red);
                    break;
                case 1:
                    container.setBackground(Color.yellow);
                    break;
                case 2:
                    container.setBackground(Color.blue);
                    break;
                case 3:
                    container.setBackground(Color.green);
                    break;
                case 4:
                    container.setBackground(Color.magenta);
                    break;
            }
        }
    }
    public static void main(String[] args)
    {
        Lab17_4combo s = new Lab17_4combo();
    }
}

由于我对Java的了解有限,我无法看出错误的位置。任何帮助将不胜感激。欢呼

5 个答案:

答案 0 :(得分:3)

您忘记了每个break

后的case语句

试试这个:

switch(chgColor)
            {
                case 0:
                    container.setBackground(Color.red);
                     break;
                case 1:
                    container.setBackground(Color.yellow);
                    break;
                case 2:
                    container.setBackground(Color.blue);
                     break;
                case 3:
                    container.setBackground(Color.green);
                    break;
                case 4:
                    container.setBackground(Color.magenta);
                    break;
                default:
                //You may add a default case here.
            }

修改: -

我认为你的情况

if(e.getSource() == colors)

永远不是真的,这就是为什么你会遇到这个问题。您可以尝试这样比较:

if(e.getSource().equals(colors))

比较对象时,请始终使用 .equals 方法。

答案 1 :(得分:1)

您应该在每个案例后使用break

       case 0:
          container.setBackground(Color.red);
          break;
        case 1:
          container.setBackground(Color.yellow);
          break;
          ....

答案 2 :(得分:1)

正如我的评论所述,您忘记在每个案例中添加break

           switch(chgColor)
            {
                case 0:
                    container.setBackground(Color.red);
                    break;
                case 1:
                    container.setBackground(Color.yellow);
                     break;
                case 2:
                    container.setBackground(Color.blue);
                    break;
                case 3:
                    container.setBackground(Color.green);
                    break;
                case 4:
                    container.setBackground(Color.magenta);
                    break;
                default:
                //What if none of above condition is satisfied.
             }

修改: - 检查代码中的评论

    class Lab17_4combo extends JFrame implements ActionListener
    {
        Container container;
        JComboBox colors;// you declared colors. 

        public Lab17_4combo()
        {
            super("ComboBox ");
            container = this.getContentPane();
            container.setLayout(new FlowLayout());
            setSize(300,200);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            String[] selectColor = {"Red", "Yellow", "Blue", "Green", "Magenta"};

            //JComboBox colors = new JComboBox(selectColor);// You declared colors again. Change     this line to 

            colors = new JComboBox(selectColor);
            colors.setSelectedIndex(-1);
            colors.addActionListener(this);

            container.add(colors);
            setVisible(true);
        }

答案 3 :(得分:0)

你需要确保并添加休息时间;在案件的每一行之后,像这样:

        switch(chgColor)
        {
            case 0:
                container.setBackground(Color.red);
                break;
            case 1:
                container.setBackground(Color.yellow);
                break;
            case 2:
                container.setBackground(Color.blue);
                break;
            case 3:
                container.setBackground(Color.green);
                break;
            case 4:
                container.setBackground(Color.magenta);
                break;
        }
    }else
        {
            container.setBackground(Color.magenta);
        }

答案 4 :(得分:0)

在给定if条件和switch语句的情况下,您总是看到洋红色。

对每个case语句使用break。

switch声明中,对于每个case,您没有break;。因此,即使switch找到有效的匹配case,它也会执行该情况,并且在您的代码中(因为您不会破坏控件以避免出现这种情况),它最终将控件传递给匹配案例之后的案例,并且总是在最后一个案例中结束。