我已经写了一个小的2d滚轮,在我在网上找到的不同代码片段的帮助下。原始包作为JFrame应用程序运行,但我试图将其转换为applet。当我在Eclipse中运行这个程序时,我不会收到任何调试错误,只是一个空白的applet查看器.我不认为我错过了从不同的applet创建来源,但可能是一些非常简单的东西。
帧类
package OurGame;
import java.awt.*;
import javax.swing.*;
public class Frame extends JApplet {
public Frame() {
JPanel frame = new JPanel();
frame.add(new Board());
// frame.setTitle("2D PLATFORMER");
// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(700,365);
frame.setVisible(true);
//frame.setLocationRelativeTo(null);
//setContentPane(frame);
}
// public static void main(String[] args){
public void init() {
new Frame();
}
}我已经把那些只能在Jframe中使用的容器去掉了。
哥们儿班
package OurGame;
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
public class Dude {
int x, dx, y,nx,nx2,left, dy;
Image still,jump,reverse;
ImageIcon s = new ImageIcon("redirect.png");
ImageIcon j= new ImageIcon("redirect.png");
ImageIcon l = new ImageIcon("redirect.png");
public Dude() {
x = 75;
left = 150;
nx = 0;
nx2= 685;
y = 172;
still = s.getImage();
}
public void move() {
if (dx != -1){
if (left + dx <= 150)
left+=dx;
else{
x = x + dx;
nx2= nx2+dx;
nx = nx + dx;
}}
else
{
if (left+dx >0)
left = left + dx;
}
}
public int getX() {
return x;
}
public int getnX() {
return nx;
}
public int getnX2() {
return nx2;
}
public int getdx() {
return dx;
}
public Image getImage() {
return still;
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT)
{ dx = -1;
still = l.getImage(); }
if (key == KeyEvent.VK_RIGHT)
{dx = 1;
still = s.getImage();
}
if (key == KeyEvent.VK_UP)
{dy = 1;
still = j.getImage();
} }
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT)
dx = 0;
if (key == KeyEvent.VK_RIGHT)
dx = 0;
if (key == KeyEvent.VK_UP)
{dy = 0;
still = s.getImage();}
}
}板级
package OurGame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Board extends JPanel implements ActionListener, Runnable {
Dude p;
public Image img;
Timer time;
int v = 172;
Thread animator;
boolean a = false;
boolean done2 = false;
public Board() {
p = new Dude();
addKeyListener(new AL());
setFocusable(true);
ImageIcon i = new ImageIcon("redirect.jpg");
img = i.getImage();
time = new Timer(5, this);
time.start();
}
public void actionPerformed(ActionEvent e) {
p.move();
repaint();
}
public void paint(Graphics g) {
if (p.dy == 1 && done2 == false) {
done2 = true;
animator = new Thread(this);
animator.start();
}
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
if ((p.getX() - 590) % 2400 == 0)// p.getX() == 590 || p.getX() == 2990)
p.nx = 0;
if ((p.getX() - 1790) % 2400 == 0)// p.getX() == 1790 || p.getX() == 4190)
p.nx2 = 0;
g2d.drawImage(img, 685 - p.getnX2(), 0, null);
if (p.getX() > 590) {
g2d.drawImage(img, 685 - p.getnX(), 0, null);
}
g2d.drawImage(p.getImage(), p.left, v, null);
if (p.getdx() == -1) {
g2d.drawImage(img, 685 - p.getnX2(), 0, null);
g2d.drawImage(p.getImage(), p.left, v, null);
}
}
private class AL extends KeyAdapter {
public void keyReleased(KeyEvent e) {
p.keyReleased(e);
}
public void keyPressed(KeyEvent e) {
p.keyPressed(e);
}
}
boolean h = false;
boolean done = false;
public void cycle() {
if (h == false)
v--;
if (v == 125)
h = true;
if (h == true && v <= 172) {
v++;
if (v == 172) {
done = true;
}
}
}
public void run() {
long beforeTime, timeDiff, sleep;
beforeTime = System.currentTimeMillis();
while (done == false) {
cycle();
timeDiff = System.currentTimeMillis() - beforeTime;
sleep = 10 - timeDiff;
if (sleep < 0)
sleep = 2;
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
System.out.println("interrupted");
}
beforeTime = System.currentTimeMillis();
}
done = false;
h = false;
done2 = false;
}
}做了大量的研究后,我有点不知所措。我认为Eclipse可能没有意识到我有多个类文件,但我编写了一个html页面来显示运行良好但完全为空的applet,从而证明了这一理论是错误的。
发布于 2011-11-30 11:20:05
为什么小程序查看器在运行时即使在eclipse中也是空白的。
在任何情况下,都不能向applet容器添加任何内容。要向applet添加一些内容,需要重写applet init()方法并调用add(new Board());。(这也可以在构造函数中完成,但是在init()方法中构建applet更常见。)
其他备注
paint(Graphics)
由于Board是一个不是顶级容器的Swing类,因此应该在paintComponent(Graphics)方法中而不是在paint(Graphics)中进行自定义绘制。
命名法
JPanel frame = new JPanel();哇!选择不当的属性名。你如何称呼你的JFrame实例,panel
应用资源
ImageIcon s = new ImageIcon("redirect.png");这将不适用于applet,也不适用于已部署的应用程序。通过URL访问图像是必要的。Applet类有一个特定的方法来加载图像。
剩余的构造函数行
JPanel frame = new JPanel();
frame.add(new Board());
frame.setSize(700,365);
frame.setVisible(true);不需要构造函数的第一行,可以将下一行中创建的Board直接添加到applet中。这还剩下两行没有注释掉。
frame.setSize(700,365);小程序的大小应该由HTML来设置。
frame.setVisible(true);添加到可见组件中的任何内容本身都将变为可见的。因此,这也是多余的。
Swing Timer
因为我指出了代码中的许多错误,所以我想我应该添加一下动画似乎是正确的--使用Swing Timer。:)
https://stackoverflow.com/questions/8316392
复制相似问题