我是一名刚刚学习Java的.net程序员。过去两周我一直在研究这个问题......
这是我的代码,用于展示我的安全系统网络摄像头并更新在applet中运行的JFrame中的图像:(我需要将此代码转换为在JPanel中工作!)
public class Streamer extends JApplet {
String PATH = "C:/Security/CamCap/";
Integer UPDATE_INTERVAL = 100;
String CAM1FILE = "current1.png";
String CAM2FILE = "current2.png";
String CAM3FILE = "current3.png";
String CAM4FILE = "current4.png";
String CAM5FILE = "current5.png";
String CAM6FILE = "current6.png";
String CAM7FILE = "current7.png";
String CAM8FILE = "current8.png";
String LOGOFILE = "logo.png";
private String path1 = PATH + CAM1FILE;
private String path2 = PATH + CAM2FILE;
private String path3 = PATH + CAM3FILE;
private String path4 = PATH + CAM4FILE;
private String path5 = PATH + CAM5FILE;
private String path6 = PATH + CAM6FILE;
private String path7 = PATH + CAM7FILE;
private String path8 = PATH + CAM8FILE;
private String pathLogo = PATH + LOGOFILE;
JFrame frame = new JFrame("@Home - Live Video");
boolean loaded = false;
JLabel label1, label2, label3, label4, label5, label6, label7, label8, labelLogo;
public void init()
{
frame.getContentPane().setBackground(Color.BLACK);
frame.setMinimumSize(new Dimension(1087, 777));
frame.setLayout(new GridLayout(3, 3, 2, 2));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1090,780);
frame.getContentPane().setSize(1087, 777);
frame.setLocationRelativeTo ( null );
frame.setVisible(true);
//INITIALIZE CAMERA 1
ImageIcon icon1 = new ImageIcon();
loaded = false;
while(!loaded)
{
try {
icon1 = new ImageIcon(ImageIO.read(new File(path1)));
loaded = true;
} catch (Exception ex) { loaded = false; }
}
label1 = new JLabel(icon1);
frame.add(label1);
//INITIALIZE CAMERA 2
ImageIcon icon2 = new ImageIcon();
loaded = false;
while(!loaded)
{
try {
icon2 = new ImageIcon(ImageIO.read(new File(path2)));
loaded = true;
} catch (Exception ex) { loaded = false; }
}
label2 = new JLabel(icon2);
frame.add(label2);
//INITIALIZE CAMERA 3
ImageIcon icon3 = new ImageIcon();
loaded = false;
while(!loaded)
{
try {
icon3 = new ImageIcon(ImageIO.read(new File(path3)));
loaded = true;
} catch (Exception ex) { loaded = false; }
}
label3 = new JLabel(icon3);
frame.add(label3);
//INITIALIZE CAMERA 4
ImageIcon icon4 = new ImageIcon();
loaded = false;
while(!loaded)
{
try {
icon4 = new ImageIcon(ImageIO.read(new File(path4)));
loaded = true;
} catch (Exception ex) { loaded = false; }
}
label4 = new JLabel(icon4);
frame.add(label4);
//INITIALIZE CAMERA 5
ImageIcon icon5 = new ImageIcon();
loaded = false;
while(!loaded)
{
try {
icon5 = new ImageIcon(ImageIO.read(new File(path5)));
loaded = true;
} catch (Exception ex) { loaded = false; }
}
label5 = new JLabel(icon5);
frame.add(label5);
//INITIALIZE CAMERA 6
ImageIcon icon6 = new ImageIcon();
loaded = false;
while(!loaded)
{
try {
icon6 = new ImageIcon(ImageIO.read(new File(path6)));
loaded = true;
} catch (Exception ex) { loaded = false; }
}
label6 = new JLabel(icon6);
frame.add(label6);
//INITIALIZE CAMERA 7
ImageIcon icon7 = new ImageIcon();
loaded = false;
while(!loaded)
{
try {
icon7 = new ImageIcon(ImageIO.read(new File(path7)));
loaded = true;
} catch (Exception ex) { loaded = false; }
}
label7 = new JLabel(icon7);
frame.add(label7);
//INITIALIZE CAMERA 8
ImageIcon icon8 = new ImageIcon();
loaded = false;
while(!loaded)
{
try {
icon8 = new ImageIcon(ImageIO.read(new File(path8)));
loaded = true;
} catch (Exception ex) { loaded = false; }
}
label8 = new JLabel(icon8);
frame.add(label8);
//INITIALIZE LOGO
ImageIcon iconLogo = new ImageIcon();
try {
iconLogo = new ImageIcon(ImageIO.read(new File(pathLogo)));
loaded = true;
} catch (Exception ex) { loaded = false; }
labelLogo = new JLabel(iconLogo);
frame.add(labelLogo);
frame.setVisible(true);
run();
}
public void run()
{
while(true)
{
try {
ImageIcon icon1 = new ImageIcon(ImageIO.read(new File(path1)));
label1.setIcon(icon1);
label1.repaint();
} catch (Exception ex) {}
try {
ImageIcon icon2 = new ImageIcon(ImageIO.read(new File(path2)));
label2.setIcon(icon2);
label2.repaint();
} catch (Exception ex) {}
try {
ImageIcon icon3 = new ImageIcon(ImageIO.read(new File(path3)));
label3.setIcon(icon3);
label3.repaint();
} catch (Exception ex) {}
try {
ImageIcon icon4 = new ImageIcon(ImageIO.read(new File(path4)));
label4.setIcon(icon4);
label4.repaint();
} catch (Exception ex) {}
try {
ImageIcon icon5 = new ImageIcon(ImageIO.read(new File(path5)));
label5.setIcon(icon5);
label5.repaint();
} catch (Exception ex) {}
try {
ImageIcon icon6 = new ImageIcon(ImageIO.read(new File(path6)));
label6.setIcon(icon6);
label6.repaint();
} catch (Exception ex) {}
try {
ImageIcon icon7 = new ImageIcon(ImageIO.read(new File(path7)));
label7.setIcon(icon7);
label7.repaint();
} catch (Exception ex) {}
try {
ImageIcon icon8 = new ImageIcon(ImageIO.read(new File(path8)));
label8.setIcon(icon8);
label8.repaint();
} catch (Exception ex) {}
try {
Thread.sleep(UPDATE_INTERVAL);
} catch (Exception ex) {}
}
}
}
我已经尝试了所有内容,但我无法找到将此代码转换为在JPanel中工作的方法。我需要在我的applet中使用JPanel,这样我的相机才能显示在一个新的独立窗口(JFrame)中。
有没有人知道如何转换(只是一小部分)此代码来在JPanel中绘制和刷新我的图像?
谢谢(提前)!
答案 0 :(得分:3)
在JLabel中使用GUI的示例,该GUI使用Swing Timer进行动画,并在JApplet中显示:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
@SuppressWarnings("serial")
public class SpriteAnimationApplet extends JApplet {
private static final String SPRITE_SHEET_SPEC = "http://www.funorb.com/img/images/game/"
+ "central/dev_diary/sprite_sheet_full.gif";
private static final int SPRITE_ROWS = 8; // an 8 x 8 sprite sheet
@Override
public void init() {
try {
final Icon[] icons = SpriteIO.getSprites(SPRITE_SHEET_SPEC, SPRITE_ROWS);
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
SpriteAnimationPanel spritePanel = new SpriteAnimationPanel(icons);
getContentPane().add(spritePanel);
spritePanel.startAnimation();
}
});
} catch (InvocationTargetException e) {
e.printStackTrace();
System.exit(-1);
} catch (InterruptedException e) {
e.printStackTrace();
System.exit(-1);
} catch (MalformedURLException e) {
e.printStackTrace();
System.exit(-1);
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
}
}
class SpriteIO {
public static Icon[] getSprites(String spriteSheetSpec, int spriteRows)
throws MalformedURLException, IOException {
Icon[] icons = new Icon[spriteRows * spriteRows];
URL spriteSheetUrl = new URL(spriteSheetSpec);
BufferedImage spriteSheet = ImageIO.read(spriteSheetUrl);
double wD = (double) spriteSheet.getWidth() / spriteRows;
double hD = (double) spriteSheet.getHeight() / spriteRows;
int w = (int) wD;
int h = (int) hD;
for (int i = 0; i < spriteRows; i++) {
for (int j = 0; j < spriteRows; j++) {
int x = (int) (i * wD);
int y = (int) (j * hD);
BufferedImage img = spriteSheet.getSubimage(x, y, w, h);
icons[j * spriteRows + i] = new ImageIcon(img);
}
}
return icons;
}
}
@SuppressWarnings("serial")
class SpriteAnimationPanel extends JPanel {
private static final int TIMER_DELAY = 200;
private Icon[] icons;
private JLabel animationLabel = new JLabel();
public SpriteAnimationPanel(Icon[] icons) {
this.icons = icons;
setLayout(new BorderLayout());
add(animationLabel );
}
public void startAnimation() {
Timer spriteTimer = new Timer(TIMER_DELAY, new ActionListener() {
private int iconIndex = 0;
@Override
public void actionPerformed(ActionEvent arg0) {
animationLabel.setIcon(icons[iconIndex]);
iconIndex++;
iconIndex %= icons.length;
}
});
spriteTimer.start();
}
}
答案 1 :(得分:3)
ImageIcon icon5 = new ImageIcon(ImageIO.read(new File(path5)));
Applet资源通常从applet的运行时类路径或主服务器加载。避免在applet中使用File
个对象,除非用户是从JFileChooser
提供的(此处不是这种情况)。
ImageIcon icon5 = new ImageIcon(this.getClass().getResource(href5));
资源的URL可以相对于applet的文档或代码库形成。
每次catch
转储堆栈跟踪。
} catch (Exception ex) {
ex.printStackTrace();
//..
确保浏览器启动小程序时显示Java Console。
Timer
正如HFoE所讨论/显示的那样。
小程序中的图像通常是缓存的。似乎applet正在多次加载图像,期望它每次都是不同的(安全摄像头的最后一帧)。要解决此问题,请将图片加载为byte[]
并将其放入ByteArrayInputStream
。然后使用ImageIO
从流中加载图像。
由于JRE无法将图片的byte[]
映射到File
路径或URL
,因此无法对其进行缓存。