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

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

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

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

Q&A

2回答

2484閲覧

「createImage」に描いた画像がJPanelに表示されません。

pip_gip

総合スコア12

Java

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

0グッド

0クリップ

投稿2016/10/16 06:14

編集2016/10/17 12:03

KSwordOfHasteさん、回答と有難うございます。

すみません、おそくなりましたがMain Class をアップしました。

是非宜しくご教示宜しくお願いします。

//----------------------------------------------------------

public class Bridge_2 extends JPanel
{
Rectangle[] zukei = new Rectangle[ 4 ] ;

int AppletWidth = 300 ;
int AppletHeight = 300 ;

Image WorkImage ;
Graphics WorkGraphics ;

// make_CreateImage---------------------------
public void make_CreateImage()
{
WorkImage = createImage( AppletWidth , AppletHeight ) ;
System.out.println( "WorkImage = " + WorkImage ) ;

WorkGraphics = WorkImage.getGraphics( ) ;
System.out.println( "WorkGraphics = " + WorkGraphics ) ;
}

// make_draw_Image---------------------------
public void make_drawImage()
{
zukei[ 0 ] = new Rectangle( 20 , 20 , 100 , 50 ) ;
System.out.println( "zukei[ 0 ] = " + zukei[ 0 ] ) ;

((Graphics2D) WorkGraphics).setColor( Color.cyan ) ;
((Graphics2D) WorkGraphics).draw( zukei[ 0 ] ) ;

repaint() ;
}

// Update----------------------------------
public void update( Graphics g )
{
paint( g ) ;
}

// paint----------------------------------

public void paint( Graphics g )
{
System.out.println( "paint_WorkImage = " + WorkImage ) ;
g.drawImage( WorkImage , 0 , 0 , this ) ;
}
}
class Main_JFrame extends JFrame
{
// Bridge_1 bridg_1 ;
Bridge_2 bridg_2 ;

public Main_JFrame( )
{
this.setDefaultCloseOperation( EXIT_ON_CLOSE ) ;

Container cnt = this.getContentPane() ;
cnt.setBackground( Color.orange ) ;

this.setLocation( 100 , 50 ) ;
this.setSize( 1450 , 900 ) ;
this.setLayout( null ) ;

bridg_2 = new Bridge_2() ;
bridg_2.setLayout( null ) ;
bridg_2.setSize( 550 , 350 ) ;
bridg_2.setLocation( 750 , 100 ) ;
cnt.add( bridg_2 ) ;

pack() ;
bridg_2.make_CreateImage() ;
}
public static void main( String[] args )
{
Main_JFrame mf = new Main_JFrame() ;
mf.setSize( 1500 , 700 ) ;
mf.setVisible( true ) ;
}
}

//-----------------------------------------------

今日は、宜しくお願いします。

「createImage」に描いた画像がうまくパネルに表示されません。
「Graphics」はうまく取得されているようなのですが、
原因がわかりません。

詳しい方、ご教示宜しくお願いします。

//----------------------------------------------------------
今日は、宜しくお願いします。

「createImage」に描いた画像がうまくパネルに表示されません。
「Graphics」はうまく取得されているようなのですが、
原因がわかりません。

詳しい方、ご教示宜しくお願いします。

//----------------------------------------------------------

public class Bridge_2 extends JPanel
{
Rectangle[] zukei = new Rectangle[ 4 ] ;

int AppletWidth = 300 ;
int AppletHeight = 300 ;

Image WorkImage ;
Graphics WorkGraphics ;

// make_CreateImage---------------------------
public void make_CreateImage()
{
WorkImage = createImage( AppletWidth , AppletHeight ) ;
System.out.println( "WorkImage = " + WorkImage ) ;

WorkGraphics = WorkImage.getGraphics( ) ;
System.out.println( "WorkGraphics = " + WorkGraphics ) ;
}

// make_draw_Image---------------------------
public void make_drawImage()
{
zukei[ 0 ] = new Rectangle( 20 , 20 , 100 , 50 ) ;
System.out.println( "zukei[ 0 ] = " + zukei[ 0 ] ) ;

((Graphics2D) WorkGraphics).setColor( Color.cyan ) ;
((Graphics2D) WorkGraphics).draw( zukei[ 0 ] ) ;

repaint() ;
}

// Update----------------------------------
public void update( Graphics g )
{
paint( g ) ;
}

// paint----------------------------------

public void paint( Graphics g )
{
System.out.println( "paint_WorkImage = " + WorkImage ) ;
g.drawImage( WorkImage , 0 , 0 , this ) ;
}
}
class Bridge_2 extends JPanel
{
Rectangle[] zukei = new Rectangle[ 4 ] ;

int AppletWidth = 300 ;
int AppletHeight = 300 ;

Image WorkImage ;
Graphics WorkGraphics ;

// make_CreateImage---------------------------
public void make_CreateImage()
{
WorkImage = createImage( AppletWidth , AppletHeight ) ;
System.out.println( "WorkImage = " + WorkImage ) ;

WorkGraphics = WorkImage.getGraphics( ) ;
System.out.println( "WorkGraphics = " + WorkGraphics ) ;
}

// make_draw_Image---------------------------
public void make_drawImage()
{
zukei[ 0 ] = new Rectangle( 20 , 20 , 100 , 50 ) ;
System.out.println( "zukei[ 0 ] = " + zukei[ 0 ] ) ;

((Graphics2D) WorkGraphics).setColor( Color.cyan ) ;
((Graphics2D) WorkGraphics).draw( zukei[ 0 ] ) ;

repaint() ;
}

// Update----------------------------------
public void update( Graphics g )
{
paint( g ) ;
}

// paint----------------------------------

public void paint( Graphics g )
{
System.out.println( "paint_WorkImage = " + WorkImage ) ;
g.drawImage( WorkImage , 0 , 0 , this ) ;
}
}

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

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

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

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

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

KSwordOfHaste

2016/10/16 09:24

プログラムが一部しか示されてないので問題が閲覧者にもわかりません。問題が起こるような最小のプログラムにした上で省略せずに全部示すのがよいと思います。なお、プログラムを示すときは編集画面の上の方にある「</>」のボタンを押してインデンテーションがきちんとついた状態のコードにして提示しましょう。閲覧者がみずらいです。
guest

回答2

0

インデンテーション・・・は、いいとして多分make_drawImageメソッドで四角形を描画しているはずなのにそれが画面に出ないという話でしょうか?もしそうならmake_drawImageメソッドがどこからも呼び出されてないからです。

机上でプログラムの動きを考えるのものすごく大事ですが、自分が慣れない題材のプログラミングする際にはデバッガなども活用してデバッグ方法も一緒に学ぶとよいと思います。

それはそうと・・・プログラムを直すというよりもう少し短いプログラムから試してみたらどうでしょうということで小さな例を挙げてみます。プログラムの作り方は人それぞれですが一つの例として参照してみてください。なお、自分は大きさを直接指定することはせずにsetPreferredSizeで希望サイズを指定して、実際のレイアウトのあれこれはJComponentにまかせるようにした方がよいと思います。またJFrameのcontentPaneのデフォルトのレイアウトはBorderLayoutですが大抵はそのまま使った方が便利なのでメイン画面をあえてほかのレイアウトにしなくてもいいのではないかなと思う方です。質問者さんのプログラムの直接のアドバイスでなくてすみません。

java

1//importは省略 2public class MyFrame extends JFrame { 3 public static void main(String[] args) { 4 new MyFrame ().setVisible(true); 5 } 6 7 public MyFrame() { 8 super("title"); 9 setDefaultCloseOperation(EXIT_ON_CLOSE); 10 getContentPane().add(new ImagePanel(), BorderLayout.CENTER); 11 pack(); 12 } 13} 14 15class ImagePanel extends JPanel { 16 Image image; 17 18 ImagePanel() { 19 setPreferredSize(new Dimension(400, 200)); 20 21 image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB); 22 Graphics g = image.getGraphics(); 23 g.setColor(Color.ORANGE); 24 g.drawRect(50, 10, 100, 80); 25 g.setColor(Color.RED); 26 g.drawOval(50, 10, 100, 80); 27 } 28 29 @Override 30 public void paintComponent(Graphics g) { 31 super.paintComponents(g); 32 g.drawImage(image, 100, 50, this); 33 } 34}

投稿2016/10/17 13:06

KSwordOfHaste

総合スコア18394

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

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

pip_gip

2016/10/17 13:33

KSwordOfHasteさん、回答有難う御座います。 アドバイス有難う御座います、今後の参考にさせて頂きます。 ところで、 「image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB);」 について質問があるのですが、 これは「createImage( )」との使い分けみたいなものはあるのでしょうか。 宜しくお願い致します。
KSwordOfHaste

2016/10/18 00:29 編集

自信もって回答できるほど詳しくないのですが、Component#createImageはそのコンポーネントのダブル・バッファリングに使用できるオフスクリーン描画イメージで、コンポーネントが表示できる状況でないと使えないし(多分)そのコンポーネント専用のイメージになると思います。一方BufferedImageの場合はいつでも好きな時に特定のComponentとは関係なく独立したImageを作る場合に使います。複数のComponent上へ描画するための共通の画像などで使うという感じでしょうか。質問者さんの目的は特定のコンポーネントのオフスクリーンイメージのための画像だと思うので本来はComponent#createImageを使う方がよいのかも知れません。しかし自分はImageObserverによる描画メカニズムがよくわかってないころComponent#createImageでは期待通り動いてくれず苦労したために簡単に使えるBufferedImageばかりを使うようになってしまったのです。上げた例がBufferedImageになっているのはそういうことなのです orz
pip_gip

2016/10/18 01:12

KSwordOfHasteさん、回答有難うございました。 > Component#createImageはその・・・イメージになると思います。 # 色々と自分なりに調べてみるとそのような内容を書いた  サイトがありました。      有難うございました、参考になりました。 # ところで、最初に回答を頂いた、   >make_drawImageメソッドがどこからも呼び出されてない    とすれば、どこの箇所から呼んでやればいいのでしょうか。   宜しくご教示お願いいたします。
KSwordOfHaste

2016/10/18 02:11

>どこの箇所から呼んでやれば・・・ 自分はまさにそこが不得意だったのでBufferedImageを使っているのです。作った直後にイメージ内にGraphics#drawXXXにより描画するのがプログラムを作る上では望ましい(そしてGraphicsをフィールドに保存しない)と思いますが、そのタイミングでうまくいくかどうかは普段使わないのでよくわかりません。ご自分で実際にトライしてみてください。
guest

0

CraftImageに書いた画像がきちんと指定してあるか試してみてください。
解決するかもしれません。

投稿2016/10/16 07:05

asadako

総合スコア147

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

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

pip_gip

2016/10/16 12:37

asadakoさん、回答有難う御座います。 >CraftImageに書いた画像がきちんと指定してあるか試してみてください。 解決するかもしれません。 # すみません、mainのプログラムを載せていませんでした。   具体的にどの個所に「画像を指定」すればよいのでしょうか。 是非宜しくお願い致します。 //---------------------------------------------------------- import java.awt.Color; import java.awt.Container; import javax.swing.JFrame; public class Main_JFrame extends JFrame { // Bridge_1 bridg_1 ; Bridge_2 bridg_2 ; public Main_JFrame( ) { this.setDefaultCloseOperation( EXIT_ON_CLOSE ) ; Container cnt = this.getContentPane() ; cnt.setBackground( Color.orange ) ; this.setLocation( 100 , 50 ) ; this.setSize( 1450 , 900 ) ; this.setLayout( null ) ; bridg_2 = new Bridge_2() ; bridg_2.setLayout( null ) ; bridg_2.setSize( 550 , 350 ) ; bridg_2.setLocation( 750 , 100 ) ; cnt.add( bridg_2 ) ; pack() ; bridg_2.make_CreateImage() ; } public static void main( String[] args ) { Main_JFrame mf = new Main_JFrame() ; mf.setSize( 1500 , 700 ) ; mf.setVisible( true ) ; } }
asadako

2016/10/17 08:00

そういう具体的なことは僕もわからないですね...(もしかしたら解決するかもしれないという気持ちで投稿したので...)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問