Applet、Panelのクラス体系について

このQ&Aのポイント
  • AppletクラスはPanelクラスの拡張として、Webブラウザで実行されるコンポーネントを作成することができます。
  • Panelクラスではできない、Webブラウザ上でのグラフィカルな操作やメディア再生などを、Appletクラスで実現することができます。
  • Frameクラスはウィンドウを表すクラスであり、Panelクラスがその中に配置されることで、画面構成を行うことができます。
回答を見る
  • ベストアンサー

Applet、Panelのクラス体系について

 Applet、Panel、Frameのクラス体系についての疑問です。  JAVA初心者です、宜しくお願いします。  AppletはPanelのサブクラスですが、一体どのような内容を拡張しているのでしょうか。  Panelクラスでは出来なくて、Appletで表現できる内容とはどのような内容でしょうか。  また、FrameのサブクラスとしてPanelクラスがあるのなら何となく理解できるのですが、 何故このようなクラス体系になっているのでしょうか。  そもそもFrameがあって、そこにPanelがaddされるというイメージなら、当然Frameのサブクラス としてPanelクラスがあると思うですが。  この考えは間違っているのでしょうか。  以上宜しくお願いします。

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 PanelがFrameから派生するのはおかしくないかい。FrameにPanelがaddされるのは、GUI的に見れば「FrameがPanelを配置するプレースホルダーになる」という事で、それはそれで良いんだけど、それをFrameだから行える作業とすると、Appletを作ったらまたApplet#add(Panel)を用意しないといけない。  Panelを配置するプレースホルダーになる役割を担うのはPanelであり(Panel#add(Panel))、そしてPanelからFrameやAppletが派生するのでFrameもPanelのプレースホルダーとなれる、Appletも然り。  GUIのイメージ的にお話をすると、何の装飾もない平面の板(Panel)があって、板(Panel)には板(Panel)を乗せる事ができる。そして、外枠とかタイトルバーとか閉じるボタンとかで装飾したものがFrame(アプリケーション板)、Webブラウザー上でHtml中に埋め込まれる機能を装飾したものがApplet(埋め込みアプリケーション板)。Frame(アプリケーション板)はPanel(板)だからPanel(板)を乗せる事ができる。  PanelクラスからAppletが派生してできる事、というのはもう少しシステマチックに物事を捉えた方が良いかも知れない。Appletは前段の通りHTML埋め込みアプリケーションの事だが、これ(HTML中に埋め込まれる機能)はPanelにとっては必要の無い機能だ。  Panelが「板という概念」を表していて、Appletは具現的な「埋め込み板」をあらわしているわけだ。Frameは「独立してアプリケーション操作ができる板」になる。  板の方が抽象的で枠がある板とか埋め込まれる板の方が具体的だからこういう派生になっていると大雑把に捉えることもできる。板を板に乗せるというのも概念であらわした方が良い。フレームにはボタンを乗せる事ができる、フレームにはテキスト入力欄を乗せる事ができる、アプレットにはボタンを乗せる・・・・とやるより、 ・パネルにはパネルを乗せる事ができる ・フレームはパネルである ・アプレットはパネルである ・ボタンはパネルである ・テキストエリアはパネルである とやった方が概念が自動的に全てのGUIコンポーネントに適用されるので自然だ、という風に私は考えておりますですはい。

dikon_007
質問者

補足

 Anmochiさん、回答有難うございます。  色々と頂いた回答について、私になりに考えては見たのですが、全体的にもうひとつ、 どのような意味か理解ができないのですが、再度補足をお願いできないでしょうか。  > Panelを配置するプレースホルダーになる役割を担うのはPanelであり(Panel#add(Panel))、   そしてPanelからFrameやAppletが派生するのでFrameもPanelのプレースホルダーとなれる、   Appletも然り。  # PanelからはFrameは派生していないのですが?

その他の回答 (1)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

super - sub の関係は既にご回答のあるとおり。 「addされるというイメージ」これは、super - sub ではなく、parent - child関係であり、 parentとchildは、直接のクラス派生関係は必要ありません。parent側に add(child) というメソッドが備わっていて、childのインスタンスを保持できればよいのです。 よって、parentは、conteiner 派生クラスである必要がある(他のクラスのインスタンスを保持してそれらも表示する機構が必要)けれど、childは、component派生クラス(自分を表示する機構をもつ、もちろんconteiner自身も含む)であればよい。

関連するQ&A

  • Appletを利用したマルチスレッドプログラミング

    現在JavaのAppletを利用したマルチスレッドのプログラミングを行っているのですが、なかなか思うように行きません。 やりたいのは同じクラスを持つインスタンスをそれぞれスレッドで動かし、それぞれ個別に操作を与えたいのです。 例えばこのサイトのページではボール1、ボール2をそれぞれ作成していますが、もう少し汎用化したいのです。 http://www.mm2d.net/applet-howto/howto-07.shtml 例えばAppletで動かすSampleBallクラスのインスタンスを複数作成し、 それぞれスレッドで動かすにはどうすれば良いでしょうか。 別クラス(ファイル)として作成したいです。 イメージとしてはこのような感じなのですが、Main.javaを起動するとAppletが起動しません。 またそれぞれスレッドで動かすということで、任意にAppletにSampleBallクラスのインスタンスを 追加したり、削除したり、操作したりするにはどうすればよいでしょうか。 ・Main.java static void main(String args[]) {   SampleBall ball1 = new SampleBall(・・・);   SampleBall ball2 = new SampleBall(・・・);   SampleBall ball3 = new SampleBall(・・・);   … } ・SampleBall.java public class SampleBall extends Applet implements Runnable{ public SampleBall(…){ ・・・ }    public void changeColor(Color col){・・・}    … } 参考になるページ等も教えて頂ければ助かります。 どうぞよろしくお願いします

  • javaのpanelが表示されません

    下記のプログラムを作ったんですが、eclipseで実行するとフレームは表示されますが、空のフレームのような状態で、panelやボタンなどは表示されません。mainとは別のクラスで作成してるからなんでしょうか?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0 { public static void main(String[] args) { new Frame0(); } } class Frame0{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • ★Appletで画像読み込み&画像表示★

    import java.awt.*; import java.applet.*; public class S1 extends Applet { Image img; public void init() { img=getImage(getCodeBase(),"sample.jpeg"); } public void paint(Graphics g){ g.drawImage(img,50,50,this); } } 以上プログラムでアプレット上に拡張子がjpeg形式のsampleという100*100の画像を表示しようとしています。 クラス名はS1で問題なくエラーもありません。 java関連のサイトでも同じようにして画像が表示できるとされていたのですが、私のパソコンではアプレット上には何も表示されないまま、アプレットのみが起動するという状態になりました。 Eclipse SDKというものを使用していますが、それが原因なのかどうかもわからず困っています。 お手数をお掛けしますが、回答の程よろしくお願いします。

    • ベストアンサー
    • Java
  • アプレットでボタンを押したときの処理について質問です。

    JAVAで2つのクラスを作成しました。 1つは初期画面で「入力」「検索」等と言ったボタンを持ち、ボタンを押されると別の画面に切り替えるクラスです。もう1つは初期画面で「入力ボタン」を押されて表示する画面のクラスです。 初期画面でボタンが押されたときの処理を次のようにしました。 public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if (command.equals("入力")){ Input input = new Input(); } ですが、Inputクラスの画面が表示されません。 Inputクラスのソースは import java.awt.*; import java.awt.event.*; import java.applet.*; /* <applet code="Input" width=250 height=250> </applet> */ public class Input extends Applet { Panel panel; TextArea textarea; public void init()//部品を初期化する { panel = new Panel(); textarea = new TextArea(); setLayout(new BorderLayout()); add(textarea,BorderLayout.CENTER); add(panel,BorderLayout.SOUTH); } } です。ボタンを押された時のイベントを受け取るまでの処理は正しいと思うのですが、どのように改良すればよろしいでしょうか?

    • ベストアンサー
    • Java
  • add( )メソッドについて

    import java.applet.Applet; import java.awt.*; /* <applet code="Sample" width=400 height=250> </applet> */ public class Sample extends Applet { public void init() { // ラベルを作成する。 Label lb = new Label("こんにちは。", Label.LEFT); add(lb); } } 上記のプログラムのadd(lb)について質問です。上記のadd()メソッドは、lbはLabelクラスなので、LabelクラスかComponentクラスのパラメーターを一つ持つvoid型のadd()メソッドとなると思うのですが、調べてもそのようなメソッドが存在しませんどうしてでしょうか?上述のことが間違っているのでしょうか?教えてください。

    • ベストアンサー
    • Java
  • アプレットのプログラムがコンパイルできません。

    import java.applet.Applet; import java.awt.*; public class Lesson1Applet extends Applet { public void init(){ this.add(new Lesson1("")); this.setLayout(null); this.resize(600,450); } } 上記のプログラムがコンパイルできません。 本の通りに作ってみたのですが、コンパイルが出来ず Servlet1118Applet.java:7: シンボルを解決できません。 シンボル: クラス Lesson1 場所 : Lesson1Applet の クラス this.add(new Lesson1("")); ^ という、エラーが出ます。 なぜコンパイル出来ないのか、わかる方がいましたら お返事お願いいたします。

    • ベストアンサー
    • Java
  • 別クラスからTextFieldなどを加える方法

    メインのクラスとは別のクラスでボタンなどを表示させたいのですが、方法がわかりません。 一応 import java.awt.*; import java.awt.event.*; class Test extends Frame{ private Image offImage; //仮想画面 private Graphics gv; // 仮想画面Graphicsオブジェクト private SubClass SC; //サブクラス public Test(){ setTitle("Test"); setSize(400,300); setVisible(true); //仮想画面の生成 offImage = createImage(400,300); gv = offImage.getGraphics(); //閉じる addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}}); //サブクラス生成 SC = new SubClass(this); myDraw(); } public static void main(String args[]){ Frame f = new Test(); } public void myDraw(){ gv.drawString("仮想画面を使って表示しています。",100,100); } public void paint(Graphics g){ //仮想画面を表示 g.drawImage(offImage,0,0,this); } public void update(Graphics g){} } class SubClass{ Test T; public SubClass(Test t){ T = t; T.add(new TextField(10)); } } こんな感じでやろうとしてみたのですが、できません。 どうすればいいか教えてください!!お願いします。。。

  • panel.add(new Button("1"));という書き方について。

    javaを学習している者です。 インスタンスを作成するには クラス名 変数名 = new クラス名(); というのが基本だと思うのですが、タイトルのような書き方(panel.add(new Button("1"))だと頭の中ではどのように考えればいいのでしょうか?変数名を持たないインスタンスを生成してパネルにのっけている、ということでしょうか?しかもこれがfor文で繰り返されていると for(int i = 0; i < 10; i++){ panel.add(new Button(Integer.toString(i))); } 余計にややこしくて分からなくなってしまいます。一応10個違うインスタンスをそれぞれ作っているのでしょうか? 本に載っていた書き方だし、エラーも出ないのでまず間違っていないのは分かるのですが、いまいちピンと来ないです・・・。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 作ったクラスにイベントを追加するには?

    パネルを継承したクラスを作りました(パネルA)。 そのパネルAをメインフレームに作成しました。 作ったパネルAの上にサブパネルBを作りました。 サブパネルのイベントを書きたいのですがコードは作ったクラス内に書けないのでしょうか? 例)下記が作ったパネル継承クラスです。この中でpnlSubを作っているのです。で、このpnlSubのクリックイベントを書きたいのですが、どのようにイベントを用意すればよいのでしょう? package ### import java.awt.*; public class PanelA extends Panel{ Image im; Panel pnlSub = new Panel(); //CONSTRUCT public PanelA(String img) { im = Toolkit.getDefaultToolkit().getImage(img); //MediaTracker画像入力監視 MediaTracker mt = new MediaTracker(this); mt.addImage(im, 0); try { mt.waitForID(0); } catch (InterruptedException e) { } //パネル(pnlVolume)設定 this.add(pnlVolume, null); pnlSub.setBackground(Color.red); pnlSub.setBounds(new Rectangle(5, 8, 108, 5)); } //Print public void paint(Graphics g) { if (g.drawImage(im, 0, 0, this) != true) { System.out.println("ng"); } } }

    • ベストアンサー
    • Java
  • HTMLファイルを開きたい

    こんにちは、いつもお世話になっています。 質問があります。 アプレットでボタンを押すと、 HTMLファイル「c:/test_folder/test.html」 を開きたいのですが、 下記コードの(☆) のところに何を書いていいかわかりません。 どなたかご存知でしたら教えていただけないでしょうか? よろしくお願いします。 ============================================================= import javax.swing.*; import java.awt.*; import java.applet.Applet; import java.awt.event.*; import java.net.*; public class situmon extends Applet implements ActionListener { JPanel panel; JButton button; public void init() { panel=new JPanel(); button=new JButton("次へ"); button.addActionListener(this); panel.add(button); this.add(panel); } public void actionPerformed(ActionEvent e) { if(e.getSource()==button) { (☆); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう