質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

JAppletを使ったコンポーネントで画像を表示したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 414

Dontes

score 13

JApplet paintcomponentでの画像参照方法

JFrameでJPanelを実現するアプリケーションを作成していて、それをJAppletで応用しようとしています。
しかし、画像だけが表示されませんでした。JAppletを継承したクラスでは、image型でデータを宣言してgetCodeBase()でURLを取得してg.drawimageで出力できるそうですが、コンテナを用いて他の、JAppletを継承していないクラスからg.drawImageで画像を出せるようにできませんか?

//import省略します
public class Mygame00 extends JApplet{
    Container c ;
    GameCtrl g;
    public Mygame00(){
        setTitle("game");
        c = getContentPane();
        c.setLayout(null);

        g = new GameCtrl( );//ゲームコントロールを呼び出す
        g.setBounds(10,10,1200,800);
        g.setBackground(Color.WHITE);
        c.add(g);
    }
         public void init() {
       setSize(1260,870);
        JFrame w = new Mygame00();
             w.setVisible(true);
         w.getRootPane();
        w.setBounds(10, 10, 1200, 800);

    }
}


↓↓↓呼び出されるゲームコントロールクラス(一部)

public GameCtrl (){
        t = new Thread(this);
        t.start();
        bo = new Bo();
        charaL = new CharaL();
        enemy = new Enemy();
        hou = new Hou();
        hp = new HP();
        inseki = new INSEKI();
        hh = new int[][]{
            {25,440,410,380,350,320},
            {25,720,750,780,810,840}
        };setFocusable(true);
        addKeyListener(this);
        addMouseListener(this);
        addMouseWheelListener(this);}

public void paintComponent( Graphics g){
        super.paintComponent(g);
            charaL.charaLPaint(g);
            Enemy.EnemyPaint(g);
            bo.BoPaint(g);
            CharaL.xy_calc();
            CharaL.G();
            Enemy.xy_calc();
            Enemy.G();
            Hou.xy_calc();
            INSEKI.xy_calc();}


といった構造になっています。(なお、このしたにKeyListenerとかがオーバーライドされています)

発生している問題・エラーメッセージ

JAppletを継承したクラスでしか画像のURLを取得できないために、コンポーネントの中で画像が表示されない

該当のソースコード

↓↓例えばBOクラスではこのようにしています。

import java.awt.Graphics;
import java.awt.Image;
import java.util.Random;

import javax.swing.ImageIcon;

public class Bo implements MyData{
    ImageIcon boIcon;
    Image boIm;
    Random r;
    public Image insekii;
    static int [][] bo;
    public Bo(){
        r = new Random();
        boIcon = new ImageIcon("./Gazo00/bo.png");
        boIm = boIcon.getImage();
        bo = new int[][]{
            {100,275,600,610},
            {300,475,500,510},
            {600,775,300,310}};


    }
    public void BoPaint( Graphics g ){
         for(int i = 0;i<3;i++)
        g.drawImage(insekii,bo[i][0],bo[i][2],null);
    }
    static void Bo_calc(){
         for(int i = 0;i<3;i++)
         {bo[i][2]+=3;bo[i][3]+=3;}
    }

}

試したこと

JApplet継承クラスに移行しようとしようとしてみたり(何を移すべきかわからず断念)、JAppletやAppletについて調べてみましたがだめでした。なお、秒数計算といった画像出力以外の処理はほとんどできています。

補足情報(FW/ツールのバージョンなど)

Eclipse Java EE IDE for Web Developers.
Neon.3 Release (4.6.3)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2018/12/31 13:09

    アプレット( 拡張した Swing 版アプレット (JApplet)含む)の移行先はJWSですかね

    キャンセル

  • asahina1979

    2018/12/31 13:11

    ただ、パブリックJREの公開がなくなる(各個人がカスタマイズJREを配布する形式になる)ので JWS も残るかどうか・・・・

    キャンセル

  • Dontes

    2018/12/31 15:38

    なるほど、、、いろいろと調べてみます。ありがとうございました!

    キャンセル

回答 1

checkベストアンサー

+2

最初にアプレットは事実上廃止された技術なので自分は古いブラウザーや古いJDKを使って「かつて動いていたであろうアプレット」を動かせる自信がありません。

よってご質問のコードの「画像が表示されない理由」についてのみ推測を述べてみます。java.awt.Imageの実装では描画時に

  • (A) ImageObserverを必要とするもの
    多分sun.awt.image.ToolkitImageの派生クラスで、java.awt.Component#createImage(ImageProducer)Toolkit#createImage(URL)などで生成したImageがこれにあたると思います。

  • (B) ImageObserverを必要としないもの
    多分sun.awt.image.ToolkitImageの派生でないクラスで、例えばjavax.imageio.ImageIO.read(URL)javax.imageio.ImageIO.read(File)などで生成したjava.awt.image.BufferedImageがこれにあたります。

があり、画面上へピクセルを転送するメカニズムが違うようです。

ご質問のコードのBoPaintを拝見しますとGraphics#drawImage(Image, int, int, ImageObserver)のImageObserverにnullを指定していますね?その方法では(B)なら表示できますが、(A)だと表示されないと思います。

もしこの推測が当たっていたとすると一番簡単な対処法はImageIOクラスを通じて画像を得ることだと思います。

例1:

class MyComponent extends JComponent {
  Image image;
  int imageX, imageY;

  public MyComponent() throws Exception { // 例外ハンドリングは省略します
    setPreferredSize(new Dimension(...)); // 適切なサイズ制約を設定

    // プログラムの中に埋め込んだ画像リソースのURLを得る
    URL url = getClass().getResource("image.jpg");

    Image image = ImageIO.read(url);
    ...
  }

  @Override
  public void paintComponent(Graphics g) {
    g.darwImage(image, imageX, imageY, null);
  }
}


なお、このコードで使っているgetResourceの書き方ではimage.jpgファイルがMyComponentと同じパッケージに含まれている必要があります。(参照: java.lang.Class#getResource)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/31 15:44

    例外処理とかの理解が追い付いていないものの、何とか出すことができました。ありがとうございました。JFrameを出すときと同じようにJAppletでも出来てくれれば楽なのになあ…って思うけど結果的に(プログラミングの世界ではそういう妥協を許さないだろうけど)できたのでよかったです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る