0

アプレットで画像を表示できません。メソッドで使用drawImage()paint()ます。(Graphics2D) キャストは、チュートリアル プログラムの一部です。画像は数秒ごとに変化し、タイトルと http リンクに対応しています。私の画像以外はすべて機能します。Oracle のチュートリアルを試し、stackoverflow に関する他の質問に目を通しました。メソッドに異なる引数を渡そうとしましdrawImage()た。また、不要な「インポート」がいくつかあると思います。

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.net.URL;
// image libraries
import java.awt.Image.*;
import java.io.*;
import java.awt.image.*; // for buffered image
import javax.imageio.*; // read buffered image
import java.awt.image.BufferedImage.*;

public class Ch_19_Ex_01 extends JApplet implements Runnable, ActionListener {
        String[] pageTitle = new String[5];
        String[] imageString = new String[5];
        URL[] pageLink = new URL[5];
        BufferedImage[] images = new BufferedImage[5];
        Color butterscotch = new Color(255, 204, 158);
        int current = 0;
        Thread runner;

public void init() {
    pageTitle = new String[] {
        "Horoscope for cancer",
        "Brainy Quotes",
        "NJ Daily Lottery",
        "Daily Jokes",
        "West Milford weather",
    };
    imageString = new String[] {
        "0.jpg",
        "1.png",
        "2.png",
        "3.jpg",
        "4.gif",
    };
    pageLink[0] = getURL("http://my.horoscope.com/astrology/free-daily-horoscope-taurus.html");
    pageLink[1] = getURL("http://www.brainyquote.com/quotes/keywords/daily_life.html");
    pageLink[2] = getURL("http://www.state.nj.us/lottery/home.shtml");
    pageLink[3] = getURL("http://www.jokes.com/");
    pageLink[4] = getURL("http://www.weather.com/weather/today/90005");

    for (int i = 0; i < 5; i++) {
        try {
            URL url = new URL(getCodeBase(), imageString[i]);
            images[i] = ImageIO.read(url);
        } catch (IOException e) {
            // dont know
        }
    }
    Button goButton = new Button("Go");
    goButton.addActionListener(this);
    FlowLayout flow = new FlowLayout();
    setLayout(flow);
    add(goButton);
    Button stopButton = new Button("Stop");
    add(stopButton);
}

URL getURL(String urlText) {
    URL pageURL = null;
    try {
        pageURL = new URL(getDocumentBase(), urlText);
    } catch (MalformedURLException m) {
        System.out.println("Error>>>>");
    }
    return pageURL;
}

public void paint(Graphics screen) {
    Graphics2D screen2D = (Graphics2D) screen;
    screen2D.setColor(butterscotch);
    screen2D.fillRect(0, 0, getSize().width, getSize().height);
    screen2D.setColor(Color.black);
    screen2D.drawString(pageTitle[current], 5, 60);
    screen2D.drawString("" + pageLink[current], 5, 80);
    screen2D.drawImage(images[current], 0, 0, 100, 200, this);
}

public void start() {
    if (runner == null) {
        runner = new Thread(this);
        runner.start();
    }
}

public void run () {
    Thread thisThread = Thread.currentThread();
    while(runner == thisThread) {
        current ++;
        if (current > 4) {
            current = 0;
        }
        repaint();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            System.out.println("Error>>>>>>>>>>>");
        }
    }
}

public void stop() {
    if (runner != null) {
        runner = null;
    }
}

public void actionPerformed(ActionEvent event) {
    if (runner != null) {
        runner = null;
    }
    AppletContext browser = getAppletContext();
    if (pageLink[current] != null) {
        browser.showDocument(pageLink[current]);
    }
}

}

4

1 に答える 1

2

私が知る限り、ペイント コードは正常に動作するはずです

問題は、ほとんどの場合、画像が読み込まれていないという事実にありますが、このプロセスで発生したエラーを無視することを選択したため、その理由はわかりません...

したがって、代わりに、画像をロードするとき// dont knowに使用しますe.printStackTrace()

for (int i = 0; i < 5; i++) {
    try {
        URL url = new URL(getCodeBase(), imageString[i]);
        images[i] = ImageIO.read(url);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

これにより、少なくとも、直面している問題についての手がかりが得られます。

Buttonまた、Swing ( JAppelt) コンテナーでAWT ( ) コンポーネントを使用することも避ける必要があります。彼らは一緒にうまくプレーしない傾向があります。

JAppeltとはいえ、学習ツールとして使用しないことをお勧めします。Java や Swing API を学ぼうとしている場合はなおさらです。Swing API は複雑で、不要な課題が追加されています。

また、トップ レベルのコンテナから拡張することは避ける必要があります (この場合、選択の余地はありません)。また、トップ レベルのコンテナに直接ペイントすることも避ける必要があります。ペイント プロセスの複雑さは別として、これらはダブル バッファリングされていないため、UI の更新時にちらつきが発生します。

代わりに、a のようなものから始めて、そのメソッドJPanelをオーバーライドしますpaintComponentJComponents はデフォルトでダブル バッファリングされるため、再描画されてもちらつきません。も呼び出す必要がありますsuper.paintXxx。前述したように、ペイント プロセスは複雑なプロセスであり、各paintXxxメソッドはチェーン内のリンクです。チェーンを壊すと、途中で奇妙な予期しない動作に備える必要があります。

コンポーネントのセットアップが完了したら、コンポーネントをより柔軟で再利用可能なものにするために、コンポーネントをJFrameやなどに追加することで、デプロイ方法を自由に選択できます。JApplet

詳細については、カスタム ペインティングの実行をご覧ください。

次に頭に浮かぶ質問は、なぜですか?JLabelsが仕事をするだけでなく、おそらくそれをより良くするのに、なぜカスタムペイントを行うのですか。

詳細については、Swing を使用した GUI の作成を参照してください...

于 2013-10-06T23:52:53.197 に答える