我在完成这项学校作业时遇到了一个大问题;幸运的是我早早开始了。我们被要求使用 JApplet
制作一个 child 数学游戏。到目前为止,一切都很好。我设法创建了一个 JPanel
,然后将其添加到 JApplet
并保存所有绘图(JPanel
内容不断重绘) .但是,每当我尝试将一个 Swing 组件(例如 JLabel
)添加到 JApplet
内容 Pane 时,它不会显示或显示曾经存在的迹象。我是 JApplet
的新手,所以如果很明显,请不要太苛刻。
代码如下:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.Timer;
public class CountingSheep extends JApplet
{
final int BOARDWIDTH = 800;
final int BOARDHEIGHT = 500;
final int SCREENWIDTH = 800;
final int SCREENHEIGHT = 800;
Dimension boardDim = new Dimension(BOARDWIDTH, BOARDHEIGHT);
Dimension screenDim = new Dimension(SCREENWIDTH, SCREENHEIGHT);
Graphics bufferGraphics;
Image offScreen;
Image backgroundImage;
Image[] sheepImage = new Image[2];
JPanel gameBoard = new JPanel(true);
List<Sheep> sheepArray = new ArrayList<>();
Timer myTimer;
public void init()
{
loadImages();
initScreen();
initBufferGraphics();
initBoard();
initTimer();
sheepArray.add(new Sheep(sheepImage));
myTimer.start();
}
private void loadImages()
{
sheepImage[0] = getImage(getDocumentBase(), "sheep.png");
sheepImage[1] = getImage(getDocumentBase(), "sheep2.png");
backgroundImage = getImage(getDocumentBase(), "bg.jpg");
}
private void initScreen()
{
setSize(800, 600);
setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
}
private void initBoard()
{
gameBoard.setPreferredSize(new Dimension(BOARDWIDTH, BOARDHEIGHT));
getContentPane().add(gameBoard);
}
private void initBufferGraphics()
{
offScreen = createImage(BOARDWIDTH, BOARDHEIGHT);
bufferGraphics = offScreen.getGraphics();
}
private void initTimer()
{
myTimer = new Timer(80, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
timerTick(e);
}
});
}
private void timerTick(ActionEvent e)
{
repaint();
}
public void paint(Graphics g)
{
bufferGraphics.clearRect(0, 0, BOARDWIDTH, BOARDHEIGHT);
bufferGraphics.drawImage(backgroundImage, 0, 0, null);
drawSheepHerd();
moveSheepHerd();
gameBoard.getGraphics().drawImage(offScreen, 0, 0, this);
}
public void drawSheepHerd()
{
for (Sheep s : sheepArray)
{
s.draw(bufferGraphics);
}
}
public void moveSheepHerd()
{
for (Sheep s : sheepArray)
{
s.move();
}
}
}
在此先感谢,希望你们能解决这个问题,因为我很困惑。
最佳答案
总结一下我的一些建议:
- 创建您自己的 ContentPane 类,该类扩展 JPanel,覆盖
paintComponent(...)
并绘制背景图像并显示动画。 - 在 JApplet 的 init 方法中调用 setContentPane(...),传入一个此类的对象。
- 试验 ContentPane 的不同布局和定位。
- 确保
paintComponent(Graphics g)
方法的第一行是:super.paintComponent(g)
这样每次绘图都会被重置油漆。 - 默认情况下 JPanel 是不透明的,您应该保留它,因为 contentPanes 必须是不透明的。如果您在 contentPane 顶部添加组件并希望看到添加组件后面的图像,您可能必须使它们不透明。
关于java - 在具有不断重新绘制的 JPanel 的 JApplet 中使用组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10960939/