3
我在學校任務中遇到了一個主要問題;幸運的是我一開始就很早就開始了。我們被要求使用JApplet
製作兒童數學遊戲。到現在爲止還挺好。我設法創建了一個JPanel
,然後將其添加到JApplet
並保存所有圖形(JPanel
內容不斷重繪)。但是,每當我嘗試向JApplet
內容窗格中添加諸如JLabel
之類的Swing組件時,它都不會顯示或顯示存在的跡象。我對JApplet
完全陌生,所以如果明顯的話請不要太苛刻。在JApplet中使用具有連續重新繪製的組件JPanel
下面是代碼:
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();
}
}
}
在此先感謝,希望你們自己看着辦吧,因爲我很爲難。
很可能這是由於applet的contentPane默認使用BorderLayout,並且您將兩個組件添加到BorderLayout.CENTER位置,但是您在哪裏添加JLabel,因爲我在代碼中沒有看到該位置? –
1+用於早期啓動項目。 ;-)。這很難看到。 –
另外,不要直接在它的paint方法中直接繪製JApplet本身,而是在其paintComponent方法中繪製JComponent或派生參數(如JPanel)。這會給你默認的雙緩衝。 –