

Java初心者です。  
現在、YesかNoかの選択肢と入力された数字（年齢）の条件に合わせて、

Yesの11-60  
Noの12-59  
Noの0-2  
Noの3-11  
Noの12-59

のそれぞれにif構文で分岐してそれぞれ異なる文と写真が出る仕組みを練習で作ろうとしていますが、Yesの11-60とNoの12-59を入力したときの動作が混同してしまいます。

数字が同じでもYes/Noの入力が異なるときに、結果が分岐するにはどうしたらいいでしょうか？

# コード内容

[code]

    import java.awt.Graphics;
    import javax.swing.*;
    
    public class conditionalLab extends JPanel {
        
        int age;
        ImageIcon picture1;
        ImageIcon picture2;
        ImageIcon picture3;
        ImageIcon picture4;
        int favorite;
        
        public conditionalLab() {
            //Your custom initialization code here
            JOptionPane.showConfirmDialog(null,
                                        "Are you Student or Military?",
                                        "Laie Palms Cinemas",
                                        JOptionPane.YES_NO_OPTION);
                                        
            final String mike = JOptionPane.showInputDialog("Please enter your age.");
            age = Integer.parseInt(mike);
            
            picture1 = new ImageIcon("dolittle.png");
            picture2 = new ImageIcon("frozen2.png");
            picture3 = new ImageIcon("starwars9.png");
            picture4 = new ImageIcon("Daisy.png");
        }
    
        @Override
        public void paintComponent(Graphics g) {
            //Your custom rendering code here
            if ((favorite == JOptionPane.YES_OPTION) && (age >= 11) && (age <= 60)){
                g.drawString("That will be $8.00, please", 10, 30);
                picture3.paintIcon(null, g, 10, 50);
    
            } else if ((favorite == JOptionPane.NO_OPTION) && (age >= 0) && (age <= 2)){
                g.drawString("You get free!",10,10);
                picture1.paintIcon(null, g, 10, 50);
    
            } else if ((favorite == JOptionPane.NO_OPTION) && (age >= 3) && (age <= 11)){
                g.drawString("You owe $7.00!",10,10);
                picture2.paintIcon(null, g, 10, 50);
    
            } else if ((favorite == JOptionPane.NO_OPTION) && (age >= 12) && (age <= 59)){
                g.drawString("You owe $10.00!",10,10);
                picture3.paintIcon(null, g, 10, 50);
    
            }else if ((favorite == JOptionPane.NO_OPTION) && (age >= 60) && (age <= 119)){
                g.drawString("That will be $7.00, please",10,10);
                picture4.paintIcon(null, g, 10, 50);
    
            } else if ((favorite == JOptionPane.NO_OPTION) && (age >= 120) && (age <= -1)){
                g.drawString("Are you sure you typed that correctly?",10,10);
               
            } 
        
        }
    
        public static void main(String[] args) {
            JFrame window = new JFrame();
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setSize(300,300);
            window.setContentPane(new conditionalLab());
            window.setVisible(true);
        }
    }
    
[/code]

# 本来の結果

[code]

    Noで12-59のいずれかの数字を入力した場合：
    You owe $10.00!
    
    Yesで11-60のいずれかの数字を入力した場合：
    That will be $8.00, please"
    
[/code]

# 実際に上のコードを使った結果

[code]

    Noで12-59のいずれかの数字を入力した場合：
    That will be $8.00, please
    
    Yesで11-60のいずれかの数字を入力した場合：
    That will be $8.00, please
    
[/code]


CC BY-SA 4.0
2020-01-30T04:59:51.953
62654
2020-02-06T00:57:13.273
2020-06-17T08:14:45.997
-1
37615
question
java
JavaでYesかNoかの選択肢と入力された数字によって結果が変わるプログラムがif構文の中でうまく機能しないです。


コメントに頂いた修正内容と最後のelsifの構文をelse構文に修正して、本来の趣旨通りに動作できたコードを下記に載せます。この度は助けて下さり、ありがとうございました！

[code]

    import java.awt.Graphics;
    import javax.swing.*;
    
    public class conditionalLab extends JPanel {
    
        int age;
        ImageIcon picture1;
        ImageIcon picture2;
        ImageIcon picture3;
        ImageIcon picture4;
        int jobs;
    
        public conditionalLab() {
            //Your custom initialization code here
            jobs = JOptionPane.showConfirmDialog(null,
                                        "Are you Student or Military?",
                                        "Laie Palms Cinemas",
                                        JOptionPane.YES_NO_OPTION);
    
            final String mike = JOptionPane.showInputDialog("Please enter your age.");
            age = Integer.parseInt(mike);
    
            picture1 = new ImageIcon("dolittle.png");
            picture2 = new ImageIcon("frozen2.png");
            picture3 = new ImageIcon("starwars9.png");
            picture4 = new ImageIcon("Daisy.png");
        }
    
        @Override
        public void paintComponent(Graphics g) {
            //Your custom rendering code here
    
            if ((jobs == JOptionPane.YES_OPTION) && (age >= 11) && (age <= 60)){
                g.drawString("That will be $8.00, please", 10, 30);
                picture3.paintIcon(null, g, 10, 50);
    
            } else if ((jobs == JOptionPane.NO_OPTION) && (age >= 0) && (age <= 2)){
                g.drawString("You get free!",10,10);
                picture1.paintIcon(null, g, 10, 50);
    
            } else if ((jobs == JOptionPane.NO_OPTION) && (age >= 3) && (age <= 11)){
                g.drawString("You owe $7.00!",10,10);
                picture2.paintIcon(null, g, 10, 50);
    
            } else if ((jobs == JOptionPane.NO_OPTION) && (age >= 12) && (age <= 59)){
                g.drawString("You owe $10.00!",10,10);
                picture3.paintIcon(null, g, 10, 50);
    
            } else if ((jobs == JOptionPane.NO_OPTION) && (age >= 60) && (age <= 119)){
                g.drawString("That will be $7.00, please",10,10);
                picture4.paintIcon(null, g, 10, 50);
    
            } else{
                g.drawString("Are you sure you typed that correctly?",10,10);
    
            }  
    
        }
    
    　　public static void main(String[] args) {
        　　SwingUtilities.invokeLater(() -> {
            　　JFrame window = new JFrame();
            　　window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            　　window.setSize(300, 300);
            　　window.setContentPane(new conditionalLab());
            　　window.setVisible(true);
       });
    }
    
[/code]


CC BY-SA 4.0
2020-01-30T05:42:01.830
62655
2020-02-06T00:57:13.273
2020-02-06T00:57:13.273
3060
37615
62654
answer


[回答に書かれているコード](https://ja.stackoverflow.com/a/62655/2808)が最新版かと思いますのでこちらを元にして記載します。

* * *

1.

おそらく意図しているのは次のような条件判定だと思います。

[code]

    if(条件1) {
        // 条件1を満たす場合の処理
    } else if (条件2) {
        // 条件1を満たさず、条件2を満たす場合の処理
    } else if (条件3) {
        // 条件1, 2を満たさず、条件3を満たす場合の処理
    } else {
        // 条件1, 2, 3 を全て満たさなかった場合の処理
    }
    
[/code]

対して、回答に書かれているコードは次のような構造になっています。

[code]

    if(条件1) {
        // 条件1を満たす場合の処理
    } 
    if (条件2) {
        // (条件1を満たすか満たさないかにかかわらず)条件2を満たす場合の処理
    }
    if (条件3) {
        // (条件1や2を満たすか満たさないかにかかわらず)条件3を満たす場合の処理
    } else {
        // (条件1や2を満たすか満たさないかにかかわらず)条件3を満たさなかった場合の処理
    }
    
[/code]

回答に記載されているコードで言うと、 `(jobs == JOptionPane.NO_OPTION) && (age >= 60) && (age <=
119)`を満たさない場合は全て(適切な返答をした学生だろうが乳児だろうが) `"Are you sure you typed that
correctly?"` が出力されていると思いますが、これは意図した結果では無いのではないでしょうか。

([コード差分](https://github.com/yukihane/stackoverflow-
qa/commit/baca86b7b8368c323506a70bfe9927d8f9d3e6a4#diff-e515c8c794d2b304e890108502c03fa0))

* * *

2.

Swingコンポーネント(`JFrame`, `JPanel`,
`JOptionPane`など)は、[原則イベントディスパッチスレッドというスレッドで操作する必要があります](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/javax/swing/package-
summary.html)。

今回のコードでは、`main`メソッドにSwing操作を書いているため、その部分がメインスレッドで処理されることになります。

上記リンク先の通り、[`SwingUtilities.invokeLater`](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/javax/swing/SwingUtilities.html#invokeLater\(java.lang.Runnable\))メソッドを利用して対処できます。

[code]

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame window = new JFrame();
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setSize(300, 300);
            window.setContentPane(new conditionalLab());
            window.setVisible(true);
        });
    }
    
[/code]

([コード差分](https://github.com/yukihane/stackoverflow-
qa/commit/806a570862356ee3cd636c90638a96da43d32387?w=1))


CC BY-SA 4.0
2020-02-01T02:38:25.537
62686
2020-02-01T02:38:25.537
2808
62654
answer