

以下のプログラムでJPanelの継承クラスとしてRate3クラスのプログラムを組みましたが、コンパイルエラーが出ます。  
恐らく今プログラムはFrame上にメニューバーを設置していることが関係しているのではないかと思いますが、それ以上の詳しい原因がわかっていません。  
Jpanelの継承クラスとする場合は、どうすればいいのか、或いはJFrameの継承クラスにする必要があるのかどうか教えて頂ければ幸いです。

* * *

**コンパイル時のエラー**

[code]

    Rate3.java:30: エラー: シンボルを見つけられません
        mbar.add(menu1);setJMenuBar(mbar);
                        ^
      シンボル:   メソッド setJMenuBar(JMenuBar)
      場所: クラス Rate3
    Rate3.java:103: エラー: シンボルを見つけられません
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ^
      シンボル:   メソッド setDefaultCloseOperation(int)
      場所: クラス Rate3
    Rate3.java:105: エラー: シンボルを見つけられません
        setTitle("Currency Exchange");
        ^
      シンボル:   メソッド setTitle(String)
      場所: クラス Rate3
    エラー3個
    
[/code]

**ソースコード**

[code]

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Rate3 extends JPanel {
      int n;
      JMenuBar mbar = new JMenuBar();
      JTextField f0 = new JTextField("");
      JButton b0 = new JButton("実行");
     
      JLabel l1 = new JLabel("Input a number and press the button.");
      JMenu menu1 = new JMenu("Please select Currency"); 
      JMenuItem item01 = new JMenuItem("USD to JPY");
      JMenuItem item02 = new JMenuItem("CNY to JPY");
      JMenuItem item03= new JMenuItem("Euro to JPY");
      boolean a=false;
      boolean b=false;boolean c=false;
     
      
    
      public Rate3() {
        //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
       // setTitle("Currency Exchange");
        setLayout(null);
        
        
        add(f0); f0.setBounds(100, 50, 50, 30);
        add(b0);b0.setBounds(150,50,50,30);
        mbar.add(menu1);setJMenuBar(mbar);
        menu1.add(item01);menu1.add(item02);menu1.add(item03);
       
        add(l1);l1.setBounds(150,140,150,100);
        //pack(); 
        setSize(400, 300);
       
       
    
        item01.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
           
           a=true;
           b=false;
           c=false;
    
    
        }
    });
    
        
    
        item02.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
            
            b=true;
            a=false;c=false;
            
    
          }
        });
    
        item03.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
            
            c=true;
            a=false;b=!c;
            
    
          }
        });
        
        b0.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
            if(a){Double n=Double.parseDouble(f0.getText());
            
                Dollar d1=new Dollar(n);
               Double d2=d1.Ex();
                l1.setText(n+"USDは"+d2+"円");}
            else if(b){Double n=Double.parseDouble(f0.getText());
               
                CNY c1=new CNY(n);
                Double c2=c1.Ex2();
                
                l1.setText(n+"人民元は"+c2+"円");}
    
            else if(c){Double n=Double.parseDouble(f0.getText());
                  
                  CNY c3=new CNY(n);
                  Double c4=c3.Ex3();
                  
                  l1.setText(n+"ユーロは"+c4+"円");}
            
            else{return;} 
                
        
            }
          });
    }
    
    
     public static void main(String[] args) throws Exception {
        new Rate3().setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        setTitle("Currency Exchange");
      }
    
    
      static class Dollar{
       int d=100;
      
       Double dl;Double n;
    
       public Dollar(Double n){
         this.n=n;
    
       }
    
       public Double Ex(){
        return dl=d*n;
       }
    
      }
    
      static class CNY {
         Double cn;
         int c=15;
         int d=120;
         Double n;
         public CNY(Double n){
           this.n=n;
         }
         
         public Double Ex2(){
          return cn=c*n;
          
         }
    
         public Double Ex3(){
           return cn=d*n;
         }
    
      }
    }
    
[/code]


CC BY-SA 4.0
2020-07-26T09:31:18.027
68982
2020-07-26T23:37:23.513
2020-07-26T16:41:43.117
3060
39688
question
java
JpanelとJFrameの使い方の違いを教えてください（ユーザーインターフェース）


Java API ドキュメントを読むと今回のような基本的な疑問については解消することが多いです。

ただ今回の場合はSwingコンポーネントについてであり、若干前提知識も必要な記述になっています(ので少し説明を加えてみます)。

  * [`javax.swing.JFrame`](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/javax/swing/JFrame.html)

> JFC/Swingコンポーネント・アーキテクチャのサポートを追加する `java.awt.Frame` の拡張バージョン。

  * [`javax.swing.JPanel`](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/javax/swing/JPanel.html)

> JPanelは、ジェネリックな軽量コンテナです。

前述「前提知識」とは、ここでは次のようなものになります:

  * 今回利用しているGUIコンポーネント "Swing" とは別に "AWT" という前身のものがあること
  * 一般的なGUIコンポーネントの用語

ただ、そのような前提知識がなくとも、上記引用文中にある
[`java.awt.Frame`](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/java/awt/Frame.html)
も併せて読めば、今回の疑問点である `JFrame`と`JPanel`の差異はある程度把握できるかと思います。

すなわち、`JFrame`は、`Frame`と同様

> `Frame`は、タイトルとボーダーを持つトップ・レベルのウィンドウ

です。逆に言うと、`JPanel`はトップレベルウィンドウではなく、タイトル(やメニュー)を持ちません。

ちなみに、`JPanel`も対応するAWTの[`Panel`](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/java/awt/Panel.html)というクラスがありますので、こちらのAPIドキュメントも参考にできます。

> `Panel`は、もっとも単純なコンテナ・クラスです。
> パネルは、ほかのパネルなどのさまざまなコンポーネントを貼り付けるためのスペースをアプリケーションに提供します。

コンパイルエラーになっているタイトル、メニューの設定などはトップレベルウィンドウのみが持つ機能へのアクセスであり、`JPanel`はそれらを備えていません。

* * *

`JFrame`のコンテンツペイン(ContentPane)に`JPanel` を設定する、というのがもしかしたら望んでいる動作かも知れません。

前出`JFame` APIドキュメントより:

> JFrameの使用に関するタスク指向のドキュメントは、「The Java Tutorial」の「[How to Make
> Frames](https://docs.oracle.com/javase/tutorial/uiswing/components/frame.html)」を参照してください。

> `JFrame` は `JRootPane` を唯一の子として保持します。 原則として、ルート・ペインが提供するコンテンツ・ペインには `JFrame`
> が表示するメニュー以外のすべてのコンポーネントが含まれる必要があります。

上記引用文中のチュートリアルが詳しいですが、差し当たって質問文のコードを最小限修正すると次のような構成になります(注:
修正を最小限に抑えたものであり、構成としてはいびつです):

[code]

    public class Rate3 extends JFrame {
    
        // 質問文の Rate3クラスに相当するもの
        public class MyJPanel extends JPanel {
            // ...
        }
    
        public static void main(String[] args) throws Exception {
            Rate3 app = new Rate3();
            // コンテンツペインにJPanelを設定
            app.getContentPane().add(app.new MyJPanel());
            app.pack();
            app.setVisible(true);
            app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            app.setTitle("Currency Exchange");
        }
    
        static class Dollar {
            // ...
        }
    
        static class CNY {
            // ...
        }
    }
    
[/code]

完全なコードは[こちら](https://github.com/yukihane/stackoverflow-
qa/blob/master/jaso68982/src/main/java/com/github/yukihane/so/Rate3.java)。


CC BY-SA 4.0
2020-07-26T23:31:56.657
68997
2020-07-26T23:37:23.513
2020-07-26T23:37:23.513
2808
2808
68982
answer