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当作学习工具。Applet 带有自己的问题,在最好的情况下很难诊断,当您尝试学习 Java 和 Swing API 时更是如此。Swing API 足够复杂,增加了不必要的挑战。

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

相反,从 a 之类的东西开始JPanel并覆盖它的paintComponent方法。 JComponents 默认是双缓冲的,所以重绘时不会闪烁。您还必须调用super.paintXxx. 正如我所说,绘画过程是一个复杂的过程,每个paintXxx方法都是链条中的一个环节,如果你打破了链条,你应该为一些奇怪的和意想不到的行为做好准备。

设置好组件后,您可以自由选择如何部署它,通过将其添加到类似JFrameorJApplet的内容中,使您的组件更加灵活和可重用。

看看Performing Custom Painting了解更多细节

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

查看使用 Swing 创建 GUI 以了解更多详细信息...

于 2013-10-06T23:52:53.197 回答