-1

基本的なスイング コンポーネントとアクション リスナーを使用してプログラムを作成しています。ほとんど動作していますが、コンボボックス アクション リスナを動作させることができないようです。何が間違っていますか?

私が理解している限り、文字列は actionlistner メソッドに渡されるはずですが、実行時に機能していません!

public class LightControl extends JFrame implements ActionListener
{

private JButton on, off, twentyWatt, fortyWatt, sixtyWatt;
private JComboBox lightTimer;
private String [] comboSelection = new String[]{"Morning","Evening","All day"};
private JTextField statusText;
private LightBulb lightbulb;
private JPanel frameContainer;
private JPanel wattFrame;
private JPanel toggleFrame;
private JPanel comboFrame;

public LightControl()
{
    super("Lightbulb");
    lightbulb=new LightBulb();

    Container container = getContentPane();
    //FlowLayout layout=new FlowLayout();

    //instantiate
    statusText=new JTextField("Select an option");
    statusText.setSize(100, 50);
    statusText.setEditable(false);
    lightTimer = new JComboBox(comboSelection);
    on = new JButton("On");
    off = new JButton("Off");
    twentyWatt=new JButton("20W");
    fortyWatt=new JButton("40W");
    sixtyWatt=new JButton("60W");


    //right hand side frames
    comboFrame=new JPanel();
    comboFrame.add(lightTimer);

    toggleFrame=new JPanel();
    toggleFrame.setLayout(new GridLayout(1, 2));
    toggleFrame.add(on);
    toggleFrame.add(off);

    wattFrame=new JPanel();
    wattFrame.setLayout(new GridLayout(1, 3));
    wattFrame.add(twentyWatt);
    wattFrame.add(fortyWatt);
    wattFrame.add(sixtyWatt);

    frameContainer=new JPanel();
    frameContainer.setLayout(new GridLayout(3,3));
    frameContainer.add(toggleFrame);
    frameContainer.add(wattFrame);
    frameContainer.add(comboFrame);



    container.add(frameContainer, BorderLayout.EAST);
    container.add(statusText);

    //actions
    on.addActionListener(this);
    off.addActionListener(this);
    twentyWatt.addActionListener(this);
    fortyWatt.addActionListener(this);
    sixtyWatt.addActionListener(this);
    lightTimer.addActionListener(this);

    setSize(600, 400);
    setVisible(true);
}




public void actionPerformed(ActionEvent e) 
{
    String Action = e.getActionCommand();

    if (Action.equals ("On"))
    {
        lightbulb.setState(true);

        twentyWatt.setEnabled(true);
        fortyWatt.setEnabled(true);
        sixtyWatt.setEnabled(true);
        lightTimer.setEnabled(true);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    }

    else if (Action.equals ("Off")) 
    {
        lightbulb.setState(false);
        twentyWatt.setEnabled(false);
        fortyWatt.setEnabled(false);
        sixtyWatt.setEnabled(false);
        lightTimer.setEnabled(false);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    }

    else if (Action.equals ("20W")) 
    {
        lightbulb.setWattage(20);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    }

    else if (Action.equals ("40W")) 
    {
        lightbulb.setWattage(40);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    }

    else if (Action.equals ("60W")) 
    {
        lightbulb.setWattage(60);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    }

    else if (Action.equals ("Morning")) 
    {
        lightbulb.setTime("Morning");
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    }

    else if (Action.equals ("Evening")) 
    {
        lightbulb.setTime("Evening");
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    }

    else if (Action.equals ("All day")) 
    {
        lightbulb.setTime("All day");
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    }


}   




 }
4

3 に答える 3

2

それは JComboBox の仕組みではありません。

  • コンポーネントごとに個別のリスナーを使用します。
  • この流れで、JComboBox に独自の ActionListener を与えます。匿名の内部クラスはうまく機能します。
  • そのリスナーで、選択されたアイテムを取得して呼び出すtoString()と、コンボボックスの選択された文字列が得られます。

例えば、

// lightTimer.addActionListener(this);
lightTimer.addActionListener(new ActionListener() {

     @Override
     public void actionPerformed(ActionEvent e) {
        String selection = lightTimer.getSelectedItem().toString();
        // use the String here
     }
});
于 2012-11-03T17:54:23.017 に答える
0

実行可能な例を提供しなかったため、実際の問題が何であるかを判断するのはちょっと難しいですが、コードを見ると、コントロールのアクション コマンドを指定していないことが問題だと思います。取得するアクション コマンドは、コンポーネントのテキストではなく、 を使用して設定されたフィールドcomponent.setActionCommand(...)です。

于 2012-11-03T17:55:49.073 に答える
0

コンボ ボックスのactionPerformedイベントがトリガーされると、e.getActionCommand()値はcomboBoxChanged. あなたのactionPerformedメソッドのコードを以下のコードに変更したところ、期待通りのコードが実行されました。

public void actionPerformed(ActionEvent e) {
    String Action = e.getActionCommand();

    if (Action.equals("On")) {
        lightbulb.setState(true);
        twentyWatt.setEnabled(true);
        fortyWatt.setEnabled(true);
        sixtyWatt.setEnabled(true);
        lightTimer.setEnabled(true);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    } else if (Action.equals("Off")) {
        lightbulb.setState(false);
        twentyWatt.setEnabled(false);
        fortyWatt.setEnabled(false);
        sixtyWatt.setEnabled(false);
        lightTimer.setEnabled(false);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    } else if (Action.equals("20W")) {
        lightbulb.setWattage(20);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    } else if (Action.equals("40W")) {
        lightbulb.setWattage(40);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    } else if (Action.equals("60W")) {
        lightbulb.setWattage(60);
        statusText.setText("\t"+lightbulb.toString());
        this.repaint();
    } else if (Action.equals("comboBoxChanged")) {
        String item = (String) lightTimer.getSelectedItem();
        if (item.equals("Morning")) {
            lightbulb.setTime("Morning");
            statusText.setText("\t"+lightbulb.toString());
            this.repaint();
        } else if (item.equals("Evening")) {
            lightbulb.setTime("Evening");
            statusText.setText("\t"+lightbulb.toString());
            this.repaint();
        } else if (item.equals("All day")) {
            lightbulb.setTime("All day");
            statusText.setText("\t"+lightbulb.toString());
            this.repaint();
        }
    }
}
于 2012-11-03T17:57:57.197 に答える