我无法在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]);
}
}
}
答案 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
方法都是链中的一个链接,如果你打破链条,你应该准备好在赛道上发生一些奇怪和意外的行为。
完成组件设置后,您可以自由选择如何部署它,方法是将其添加到JFrame
或JApplet
之类的内容中,从而使您的组件更加灵活和可重用。
请查看Performing Custom Painting了解详情
想到的下一个问题是为什么?为什么要进行任何自定义绘画,JLabel
s不仅可以完成这项工作,而且可能会做得更好。
请查看Creating an GUI with Swing了解更多详情......