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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

456閲覧

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

Dontes

総合スコア13

JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/12/30 13:32

編集2018/12/30 16:15

JApplet paintcomponentでの画像参照方法

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

java

1//import省略します 2public class Mygame00 extends JApplet{ 3 Container c ; 4 GameCtrl g; 5 public Mygame00(){ 6 setTitle("game"); 7 c = getContentPane(); 8 c.setLayout(null); 9 10 g = new GameCtrl( );//ゲームコントロールを呼び出す 11 g.setBounds(10,10,1200,800); 12 g.setBackground(Color.WHITE); 13 c.add(g); 14 } 15 public void init() { 16       setSize(1260,870); 17 JFrame w = new Mygame00(); 18      w.setVisible(true); 19         w.getRootPane(); 20     w.setBounds(10, 10, 1200, 800); 21 22 } 23} 24

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

java

1 2public GameCtrl (){ 3 t = new Thread(this); 4 t.start(); 5 bo = new Bo(); 6 charaL = new CharaL(); 7 enemy = new Enemy(); 8 hou = new Hou(); 9 hp = new HP(); 10 inseki = new INSEKI(); 11 hh = new int[][]{ 12 {25,440,410,380,350,320}, 13 {25,720,750,780,810,840} 14 };setFocusable(true); 15 addKeyListener(this); 16 addMouseListener(this); 17 addMouseWheelListener(this);} 18 19public void paintComponent( Graphics g){ 20 super.paintComponent(g); 21 charaL.charaLPaint(g); 22 Enemy.EnemyPaint(g); 23 bo.BoPaint(g); 24 CharaL.xy_calc(); 25 CharaL.G(); 26 Enemy.xy_calc(); 27 Enemy.G(); 28 Hou.xy_calc(); 29 INSEKI.xy_calc();}

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

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

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

該当のソースコード

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

java

1import java.awt.Graphics; 2import java.awt.Image; 3import java.util.Random; 4 5import javax.swing.ImageIcon; 6 7public class Bo implements MyData{ 8 ImageIcon boIcon; 9 Image boIm; 10 Random r; 11 public Image insekii; 12 static int [][] bo; 13 public Bo(){ 14 r = new Random(); 15 boIcon = new ImageIcon("./Gazo00/bo.png"); 16 boIm = boIcon.getImage(); 17 bo = new int[][]{ 18 {100,275,600,610}, 19 {300,475,500,510}, 20 {600,775,300,310}}; 21 22 23 } 24 public void BoPaint( Graphics g ){ 25 for(int i = 0;i<3;i++) 26 g.drawImage(insekii,bo[i][0],bo[i][2],null); 27 } 28 static void Bo_calc(){ 29 for(int i = 0;i<3;i++) 30 {bo[i][2]+=3;bo[i][3]+=3;} 31 } 32 33}

試したこと

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/30 16:34

ローカルJDKのアプレットビューアしか基本見れないのになぜその移植w
Dontes

2018/12/31 00:06

え??まさかWEBにJAppletを置くことはできないのですか? 他に方法があるのなら教えてほしいです。 初歩的な質問ですみません。
退会済みユーザー

退会済みユーザー

2018/12/31 04:09

アプレット( 拡張した Swing 版アプレット (JApplet)含む)の移行先はJWSですかね
退会済みユーザー

退会済みユーザー

2018/12/31 04:11

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

2018/12/31 06:38

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

回答1

0

ベストアンサー

最初にアプレットは事実上廃止された技術なので自分は古いブラウザーや古い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:

java

1class MyComponent extends JComponent { 2 Image image; 3 int imageX, imageY; 4 5 public MyComponent() throws Exception { // 例外ハンドリングは省略します 6 setPreferredSize(new Dimension(...)); // 適切なサイズ制約を設定 7 8 // プログラムの中に埋め込んだ画像リソースのURLを得る 9 URL url = getClass().getResource("image.jpg"); 10 11 Image image = ImageIO.read(url); 12 ... 13 } 14 15 @Override 16 public void paintComponent(Graphics g) { 17 g.darwImage(image, imageX, imageY, null); 18 } 19}

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

投稿2018/12/30 19:25

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dontes

2018/12/31 06:44

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問