2012-03-23 14 views
2

私のトピックでいくつかの答えを読んだが、私は答えを見つけられなかった。 私は自分のJavaコードの背景が好きです。 ここでは、画像のコードを入力するためにのみ参照します。 しかし、動作しません。Java Swingアプリケーションで背景画像を表示

import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
public class background extends JFrame { 
    private Container c; 
    private JPanel imagePanel; 

    public background() { 
     initialize(); 
    } 

    private void initialize() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     c = getContentPane(); 
     imagePanel = new JPanel() { 
      public void paint(Graphics g) { 
       try { 
        BufferedImage image = ImageIO.read(new File("http://www.signe-zodiaque.com/images/signes/balance.jpg")); 
        g.drawImage(image, 1000, 2000, null); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     imagePanel.setPreferredSize(new Dimension(640, 480)); 
     c.add(imagePanel); 
    } 
+4

* "それは動作しません" *多分それはストライキ、または眠い、あるいは単なる怠け者です。第一に、交渉する。第二に、それは良い夜の休息を与え、朝にそれを試してください。 3日目は、ニンジン&スティックのアプローチを試してみてください。何か他には、1)何が起こると予想されたか2)実際に何が起こったか、そして実用性について3)なぜあなたは(1)が起こることを期待したのかを説明してください。 –

答えて

6

このコードはどこにありますか?チュートリアルの場合は、非常に悪い習慣を教えているので、それを捨ててください。例えば、...

  • あなたpaint(...)またはpaintComponent(...)メソッド内からイメージファイル(または任意のファイル)で読みたいことはありません。 1つは、プログラムを一度に読み込んで処理できるようになるたびに、ファイルを再読み込みするたびにファイルを再読み込みさせる理由です。しかし、さらに重要なのは、paint/paintComponentメソッドが、できるだけ早く、素早く、素早くなるようにしたい場合です。描画が遅く、クルーニーである場合、ユーザーはプログラムが遅くてクルーニーであると感じます。
  • paint(...)メソッドではなく、JPanelのpaintComponent(...)メソッドで描画してください。ペイントを描画すると、Swingが提供するダブルバッファリングがすべて失われ、アニメーションがぎくしゃくします。
  • スーパーのpaintComponent(...)メソッドを最初に呼び出します。
  • スイングのグラフィックスとドローイングの方法については、Painting with Swing tutorialsの公式を読んでください。上のコードから推測しているように、最も基本的なステップはまだありません。あなたはこれを後悔しません。
  • また、あなたが動作するとは思わないファイルとしてURLをロードしようとしているようです。代わりにURLオブジェクトを使用してください。たとえば、

...

public class ZodiacImage extends JPanel { 
    private static final String IMG_PATH = "http://www.signe-zodiaque.com/" + 
     "images/signes/balance.jpg"; 
    private BufferedImage image; 

    public ZodiacImage() { 
     // either read in your image here using a ImageIO.read(URL) 
     // and place it into the image variable, or else 
     // create a constructor that accepts an Image parameter. 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (image != null) { 
     // draw your image here. 
     } 
    } 

    @Override //if you want the size to match the images 
    public Dimension getPreferredSize() { 
     if (image != null) { 
     return new Dimension(image.getWidth(), image.getHeight()); 
     } 
     return super.getPreferredSize(); 
    } 
} 
+3

'g.drawImage(image、1000、2000、null);'がほとんど愚かであるところに追加されました。これらのコーディネートは私の物理的な画面から外れ、コンテナは 'ImageObserver'として使われるべきです。次にSwingパネルに 'paint()'がオーバーライドされ、アプリケーションリソースを 'File'としてロードしようとすると、(一見)不必要なSwingフレームが伸びてしまいます。 –

+3

@ leen.zd: ''私たちはJoshua BlochまたはJames Goslingを意味しない限り、常にこのメソッドを使用します。ペイントを描画すると、Swingが提供するダブルバッファリングがすべて失われ、アニメーションがぎくしゃくします。また、 ''は動作しません。 ''私たちにはあまり言いません。どのように機能しないのですか?何がうまくいかない?エラーはありますか?さあ、重要な詳細を教えてください。 –

+3

@leen:Webリソースをファイルとしてロードしようとしています。編集を参照してください。 –

関連する問題