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

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

ただいまの
回答率

90.51%

  • Java

    15830questions

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

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

受付中

回答 2

投稿 編集

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

pip_gip

score 6

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 ) ; 

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • KSwordOfHaste

    2016/10/16 18:24

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

    キャンセル

回答 2

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/16 21: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 ) ;
    }
    }

    キャンセル

  • 2016/10/17 17:00

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

    キャンセル

0

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

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

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

//importは省略
public class MyFrame extends JFrame {
    public static void main(String[] args) {
        new MyFrame ().setVisible(true);
    }

    public MyFrame() {
        super("title");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        getContentPane().add(new ImagePanel(), BorderLayout.CENTER);
        pack();
    }
}

class ImagePanel extends JPanel {
    Image image;

    ImagePanel() {
        setPreferredSize(new Dimension(400, 200));

        image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB);
        Graphics g = image.getGraphics();
        g.setColor(Color.ORANGE);
        g.drawRect(50, 10, 100, 80);
        g.setColor(Color.RED);
        g.drawOval(50, 10, 100, 80);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        g.drawImage(image, 100, 50, this);
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/17 22:33

    KSwordOfHasteさん、回答有難う御座います。
    アドバイス有難う御座います、今後の参考にさせて頂きます。

    ところで、
    「image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_ARGB);」
    について質問があるのですが、
    これは「createImage( )」との使い分けみたいなものはあるのでしょうか。

    宜しくお願い致します。

    キャンセル

  • 2016/10/18 09:29 編集

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

    キャンセル

  • 2016/10/18 10:12

    KSwordOfHasteさん、回答有難うございました。

    > Component#createImageはその・・・イメージになると思います。

    # 色々と自分なりに調べてみるとそのような内容を書いた
     サイトがありました。   
      有難うございました、参考になりました。

    # ところで、最初に回答を頂いた、
      >make_drawImageメソッドがどこからも呼び出されてない
     
     とすれば、どこの箇所から呼んでやればいいのでしょうか。
      宜しくご教示お願いいたします。

    キャンセル

  • 2016/10/18 11:11

    >どこの箇所から呼んでやれば・・・

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

    キャンセル

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

  • Java

    15830questions

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