2012-06-09 53 views
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(); 
     } 
    } 
} 

在此先感謝,希望你們自己看着辦吧,因爲我很爲難。

+0

很可能這是由於applet的contentPane默認使用BorderLayout,並且您將兩個組件添加到BorderLayout.CENTER位置,但是您在哪裏添加JLabel,因爲我在代碼中沒有看到該位置? –

+0

1+用於早期啓動項目。 ;-)。這很難看到。 –

+0

另外,不要直接在它的paint方法中直接繪製JApplet本身,而是在其paintComponent方法中繪製JComponent或派生參數(如JPanel)。這會給你默認的雙緩衝。 –

回答

3

總結我的一些建議:

  • 創建您自己的contentPane類擴展JPanel,它覆蓋paintComponent(...)且繪製背景圖片,並顯示動畫。
  • 在init方法的JApplet上調用setContentPane(...),傳入此類的一個對象。
  • 試用ContentPane的不同佈局和位置。
  • 請確保paintComponent(Graphics g)方法的第一行是:super.paintComponent(g),以便您的繪圖在每次繪製時都會被重置。
  • 默認情況下,JPanels是不透明的,您應該保持原樣,因爲contentPanes必須是不透明的。如果您在contentPane頂部添加組件,並且想要查看添加組件後面的圖像,則可能必須使其不透明。