java - Java小程序中的drawImage

标签 java swing applet drawimage

我无法在小程序中显示图像。在 paint() 方法中使用 drawImage()。 (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]);
    }
}

}

最佳答案

据我所知,您的绘制代码应该可以正常工作

问题很可能是图像未加载,但由于您选择忽略此过程引发的任何错误,因此您不知道为什么......

因此,加载图像时使用 e.printStackTrace(),而不是 //dont Know

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 (JAppelt) 容器上使用 AWT (Button) 组件。他们往往相处得不好。

话虽如此,我还是建议您不要使用 JAppelt 作为学习工具。 Applet 会带来一些自己的问题,即使在最好的情况下也很难诊断,当您尝试学习 Java 和 Swing API 时更是如此。 Swing API 足够复杂,增加了不必要的挑战。

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

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

完成组件设置后,您可以自由选择如何部署它,将其添加到 JFrameJApplet 等内容中,使您的组件更加灵活并且可重复使用。

看看Performing Custom Painting了解更多详情

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

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

关于java - Java小程序中的drawImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19215149/

相关文章:

java - 用于 Applet 或 Android 的 Java Red5 客户端

java - 有效的正则表达式?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 我找不到错误代码为 "Cannot find symbol"的原因

java - 初始化后更新选项卡内容

java - 在 swing jtable 中的行数之后插入行或记录

java - 如何将以下 Java 代码转换为 Node.js?

java - JComboBox 的问题

Java 1.7.0_u25 小程序用eclipse调试

java - 基于网络浏览器的 GUI