Java applet中的drawImage

时间:2013-10-06 23:26:31

标签: java swing applet drawimage

我无法在applet中显示图片。在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]);
    }
}

}

1 个答案:

答案 0 :(得分: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();
    }
}

这至少可以为您提供更多关于您所面临问题的线索。

您还应该避免在Swing(Button)容器上使用AWT(JAppelt)组件。他们往往不能很好地一起玩。

说了这么多,我建议你不要使用JAppelt作为学习工具。 Applet带有一大堆他们自己的问题,这些问题在最好的情况下难以诊断,当您尝试学习Java和Swing API时更是如此。 Swing API非常复杂,增加了不必要的挑战。

您还应避免从顶级容器扩展(在这种情况下,您别无选择),但您还应避免直接绘制到顶级容器。除了绘制过程的复杂性之外,它们不是双缓冲的,这会在UI更新时引入闪烁。

相反,请从JPanel开始,并覆盖它的paintComponent方法。 JComponent默认为双缓冲,因此重绘时不会闪烁。您还必须致电super.paintXxx。正如我所说,绘制过程是一个复杂的过程,每个paintXxx方法都是链中的一个链接,如果你打破链条,你应该准备好在赛道上发生一些奇怪和意外的行为。

完成组件设置后,您可以自由选择如何部署它,方法是将其添加到JFrameJApplet之类的内容中,从而使您的组件更加灵活和可重用。

请查看Performing Custom Painting了解详情

想到的下一个问题是为什么?为什么要进行任何自定义绘画,JLabel s不仅可以完成这项工作,而且可能会做得更好。

请查看Creating an GUI with Swing了解更多详情......