2

フレームに画像を表示する際に問題が発生しています。画像が表示されると、左上隅が指定された (0,0) に移動しません。また、ウィンドウの背景は、最初に実行したときにウィンドウの背後にあったものの視覚コンポーネントを取得します。誰が何が悪いのか知っていますか?前もって感謝します-

import java.awt.image.ImageObserver;
import java.io.File;
import javax.imageio.*;
import javax.swing.*;

public class Window extends JFrame{
//the pictures
Image testImage = null;
Image backPic  = null;


//constructor
Window(){
    super("window");
    this.startWindow();
}

public void startWindow(){
    Image customIcon = Toolkit.getDefaultToolkit().getImage("iconImage.gif");
    testImage = Toolkit.getDefaultToolkit().getImage("tester.gif");
    backPic = Toolkit.getDefaultToolkit().getImage("black.png");
    setSize(700,600);
    setIconImage(customIcon);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    setResizable(false);
    setLocationRelativeTo(null);
}


public void paint(Graphics g){
    g.drawImage(testImage,0,0,null);
}
}
4

2 に答える 2

3

問題は、が呼び出されたときに testImage がまだ完全にロードされていないことpaint()です。これを修正するには、代わりにこれを呼び出すことができます:

g.drawImage(testImage,0,0,this);

しかし、私の好みのアプローチは、JLabel を使用して、画像の描画を処理させることです。また、オーバーライドしないことを強くお勧めしますJFrame.paint()(オーバーライドする場合は、少なくとも を呼び出しますsuper.paint(g))。本当に自分で画像を描きたい場合は、拡張JComponentしてオーバーライドしますpaintComponent()

于 2012-05-29T13:52:05.870 に答える
2

だから、あなたへの私のアドバイスはJLabels、例えば示すために使用しますImages、それはあなたが確実に使用できる最も簡単な方法です。私はこのようにデモンストレーションする同様の基本的なプロジェクトを作成しました。

/**
 * @author Sajmon
 */

package com.sajmon.window;

import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Window extends JFrame {

    private JLabel pictureLabel;
    private Container controls;

    public Window() {
        super("window");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
        this.setSize(300, 300);
        this.startWindow();
    }

    private void startWindow() {
        controls = new Container();
        controls = getContentPane();
        controls.setLayout(new FlowLayout());
        pictureLabel = new JLabel(new ImageIcon("picture.png"));
        controls.add(pictureLabel);
    }
}

そして、アプリケーションを実行するためのメインメソッド。

/**
 *
 * @author Sajmon
 */
public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Window w = new Window();
                w.setVisible(true);
            }
        });
    }    
}

注: Swingを使用している場合は、Runnableインターフェースを使用してアプリケーションを起動する必要があります。この方法が一般的に推奨されます。

それが役に立てば幸い。

于 2012-05-29T13:50:37.253 に答える