

グリッドレイアウトの一部に、演算用のカードレイアウトを4枚（+-*/）登録し、別のグリッドレイアウトに登録した演算切り替えのラジオボタンで、演算用のカードレイアウトを切り替えたいのですが、切り替えがうまく出来ません。切り替え表示以外の動作は問題なく出来ています。切り替え表示がうまくいかない原因がわからず詰まっている状態です。

[code]

    package lec0402;
    
    import java.applet.Applet;
    import java.awt.Button;
    import java.awt.CardLayout;
    import java.awt.Checkbox;
    import java.awt.CheckboxGroup;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.Label;
    import java.awt.Panel;
    import java.awt.TextField;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    
    import lec0401Util.Keisan;
    
    public class lec0402kadai extends Applet implements ActionListener, ItemListener {
            //フィールドの定義
            //パネル
            Panel plusPanel = new Panel();
            Panel minusPanel = new Panel();
            Panel multiplyPanel = new Panel();
            Panel dividePanel = new Panel();
            Panel answerPanel = new Panel();
            Panel operatorPanel = new Panel();
    
            //テキストフィールド
            TextField plusText1 = new TextField("", 4);
            TextField plusText2 = new TextField("", 4);
            TextField minusText1 = new TextField("", 4);
            TextField minusText2 = new TextField("", 4);
            TextField multiplyText1 = new TextField("", 4);
            TextField multiplyText2 = new TextField("", 4);
            TextField divideText1 = new TextField("", 4);
            TextField divideText2 = new TextField("", 4);
            TextField answerText = new TextField("", 4);
    
            //ボタン
            Button calcButton = new Button("=");
    
            //チェックボックス
            CheckboxGroup cgroup = new CheckboxGroup();
            Checkbox plusCheckbox  = new Checkbox("+", cgroup, true);
            Checkbox minusCheckbox = new Checkbox("-", cgroup, false);
            Checkbox multiplyCheckbox = new Checkbox("*", cgroup, false);
            Checkbox divideCheckbox   = new Checkbox("/", cgroup, false);
            Checkbox selected;
    
            //panel for CardLayout
            Panel panel = new Panel();
            CardLayout cardPanel = new CardLayout();
    
            public void init(){
    
                //plusPanelにFlowLayoutを設定しコンポーネントを登録する
                plusPanel.setLayout(new FlowLayout());
                plusPanel.add(plusText1);
                plusPanel.add(new Label("+"));
                plusPanel.add(plusText2);
    
                //minusPanelにFlowLayoutを設定しコンポーネントを登録する
                minusPanel.setLayout(new FlowLayout());
                minusPanel.add(minusText1);
                minusPanel.add(new Label("-"));
                minusPanel.add(minusText2);
    
                //multiplyPanelにFlowLayoutを設定しコンポーネントを登録する
                multiplyPanel.setLayout(new FlowLayout());
                multiplyPanel.add(multiplyText1);
                multiplyPanel.add(new Label("*"));
                multiplyPanel.add(multiplyText2);
    
                //dividePanelにFlowLayoutを設定しコンポーネントを登録する
                dividePanel.setLayout(new FlowLayout());
                dividePanel.add(divideText1);
                dividePanel.add(new Label("/"));
                dividePanel.add(divideText2);
    
                //answerPanelにFlowLayoutを設定しコンポーネントを登録する
                answerPanel.setLayout(new FlowLayout());
                answerPanel.add(calcButton);
                answerPanel.add(answerText);
    
                //operatorパネルにFlowLayoutを設定しコンポーネントを登録する
                operatorPanel.setLayout(new FlowLayout());
                operatorPanel.add(plusCheckbox);
                operatorPanel.add(minusCheckbox);
                operatorPanel.add(multiplyCheckbox);
                operatorPanel.add(divideCheckbox);
    
                //layout manager setting
                //for cardlayout
                setLayout(cardPanel);
                panel.add(plusPanel,"card1");
                panel.add(minusPanel,"card2");
                panel.add(multiplyPanel,"card3");
                panel.add(dividePanel,"card4");
    
                plusCheckbox.addItemListener(this);
                minusCheckbox.addItemListener(this);
                multiplyCheckbox.addItemListener(this);
                divideCheckbox.addItemListener(this);
    
                cardPanel.first(this);
    
                //アプレットにGridLayoutを設定し，パネルを登録し配置していく
                setLayout( new GridLayout(2, 2) );
                add(panel);
                add(operatorPanel);
                add(answerPanel);
                add(new Panel()); //dammy
    
                //ボタンをリスナーとして登録する
                calcButton.addActionListener(this);
    
                //define contents of on/off which has object(register events)
                plusCheckbox.addItemListener(this);
                minusCheckbox.addItemListener(this);
                multiplyCheckbox.addItemListener(this);
                divideCheckbox.addItemListener(this);
    
            }
    
            //excute contents of on/off
            public void itemStateChanged(ItemEvent e) {
                Checkbox selected = cgroup.getSelectedCheckbox();
    
                if(selected == plusCheckbox){
                    cardPanel.show(plusPanel,"card1");
                }else if (selected == minusCheckbox){
                   cardPanel.show(minusPanel,"card2");
                }else if (selected == multiplyCheckbox){
                    cardPanel.show(multiplyPanel,"card3");
                }else if (selected == divideCheckbox){
                    cardPanel.show(dividePanel, "card4");
                }
            }
    
            public void actionPerformed(ActionEvent e) {
    
                //選択されているチェックボックスを取得する
                Checkbox selected = cgroup.getSelectedCheckbox();
    
                //選択されている演算に応じて，計算を行う
                if (selected == plusCheckbox) {
                    //数値を取得する
                    double v1 = Double.parseDouble( plusText1.getText() );
                    double v2 = Double.parseDouble( plusText2.getText() );
                    //Keisanクラスを2つの数値を渡して生成する
                    Keisan k = new Keisan(v1, v2);
                    //計算結果を表示する
                    answerText.setText( String.valueOf( k.plus() ) );
                }
                else if (selected == minusCheckbox) {
                    double v1 = Double.parseDouble( minusText1.getText() );
                    double v2 = Double.parseDouble( minusText2.getText() );
                    Keisan k = new Keisan(v1, v2);
                    answerText.setText( String.valueOf( k.minus() ) );
                }
                else if (selected == multiplyCheckbox) {
                    double v1 = Double.parseDouble( multiplyText1.getText() );
                    double v2 = Double.parseDouble( multiplyText2.getText() );
                    Keisan k = new Keisan(v1, v2);
                    answerText.setText( String.valueOf( k.multiply() ) );
                }
                else if (selected == divideCheckbox) {
                    double v1 = Double.parseDouble( divideText1.getText() );
                    double v2 = Double.parseDouble( divideText2.getText() );
                    Keisan k = new Keisan(v1, v2);
                    answerText.setText( String.valueOf( k.divide() ) );
                }
            }
    }
    
[/code]


CC BY-SA 4.0
2019-07-23T12:46:41.067
56846
2019-07-24T10:59:44.173
2019-07-23T15:42:15.767
32986
34781
question
java
グリッドレイアウトに登録したカードパネルの切り替えについて


[CardLayout#show](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/CardLayout.html#show-
java.awt.Container-java.lang.String-)は第一引数の **コンテナ(JPanelなどの親パネル)**
の中に第二引数の名前のコントロールを表示します。  
setLayoutの対象もおそらく間違っていますので、下記のヒントを参考にコードを見直してみてください。

[code]

    // 下記のコードの場合、 layout manager setting for cardlayout がpanel対象ではない。
    setLayout(cardPanel);
    //cardPanel.show(plusPanel,"card1"); // 修正前
    cardPanel.show(panel,"card1");       // 修正後
    
[/code]


CC BY-SA 4.0
2019-07-24T04:24:46.050
56855
2019-07-24T10:59:44.173
2019-07-24T10:59:44.173
9820
9820
56846
answer