2016-08-03 67 views
0

即时制作数学游戏并希望使用gif作为背景。它的尺寸是1100 * 800GiF作为JFrame的背景

我搜索了很多文章如何添加GIF作为背景,但没有成功。一个简单的方法有什么建议(如果使用其他组件-JPanel,......,请你展示如何?)

到目前为止,这是我的JFrame的代码:

public class Game extends JFrame implements ActionListener { 
     private JButton play, endG, tutorial, login, easy, medium, hard, next, checkAnswer; 
     private JTextArea answer; 
     int total, goodAnswer = 0; 

     public Game(String heading) { 
      super(heading); 
      this.setSize(1100, 800); 
      this.setLayout(null); 


      firstScreen(); 
      setResizable(false); 

     } 

     public void firstScreen() { 
      getContentPane().removeAll(); 

      play = new JButton(); 
      play.setBounds(373, 350, 354, 80); 
      play.setIcon(new ImageIcon("entrancePlayButton.png")); 
      play.addActionListener(this); 
      play.setOpaque(false); 
      play.setContentAreaFilled(false); 
      add(play); 

      tutorial = new JButton("Tutorial"); 
      tutorial.setBounds(345, 520, 150, 50); 
      tutorial.setFont(new Font("Arial", Font.PLAIN, 20)); 
      tutorial.addActionListener(this); 
      tutorial.setOpaque(false); 
      tutorial.setContentAreaFilled(false); 
      add(tutorial); 

      endG = new JButton("End Game"); 
      endG.setBounds(605, 520, 150, 50); 
      endG.setFont(new Font("Arial", Font.PLAIN, 20)); 
      endG.addActionListener(this); 
      endG.setOpaque(false); 
      endG.setContentAreaFilled(false); 
      add(endG); 

      revalidate(); 
      repaint(); 
     } 

     public void difficultyScreen() { 
      getContentPane().removeAll(); 

      easy = new JButton("Easy"); 
      easy.setBounds(450, 310, 200, 80); 
      easy.setFont(new Font("Arial", Font.PLAIN, 30)); 
      easy.addActionListener(this); 
      easy.setOpaque(false); 
      easy.setContentAreaFilled(false); 
      add(easy); 

      medium = new JButton("Medium"); 
      medium.setBounds(450, 440, 200, 80); 
      medium.setFont(new Font("Arial", Font.PLAIN, 30)); 
      medium.addActionListener(this); 
      medium.setOpaque(false); 
      medium.setContentAreaFilled(false); 
      add(medium); 

      hard = new JButton("Hard"); 
      hard.setBounds(450, 570, 200, 80); 
      hard.setFont(new Font("Arial", Font.PLAIN, 30)); 
      hard.addActionListener(this); 
      hard.setOpaque(false); 
      hard.setContentAreaFilled(false); 
      add(hard); 

      endG = new JButton("Exit"); 
      endG.setBounds(1000, 700, 60, 30); 
      endG.setFont(new Font("Arial", Font.PLAIN, 15)); 
      endG.addActionListener(this); 
      endG.setOpaque(false); 
      endG.setContentAreaFilled(false); 
      add(endG); 

      revalidate(); 
      repaint(); 
     } 

     public void playGameScreen() { 
      getContentPane().removeAll(); 



      revalidate(); 
      repaint(); 
     } 

     public void tutorialScreen() { 
      getContentPane().removeAll(); 



      revalidate(); 
      repaint(); 
     } 

     private static double stringToDouble(String number) { 
      double num = Double.parseDouble(number); 
      return num; 
     } 

     public static void main() { 
      Game areaGame = new Game("Area Game"); 
      areaGame.setVisible(true); 
     } 

     public void actionPerformed(ActionEvent actionEvent) { 
      if (actionEvent.getSource() == play) { 
       difficultyScreen(); 
      } 

      if (actionEvent.getSource() == tutorial) { 
       tutorialScreen(); 
      } 

      if (actionEvent.getSource() == endG) { 
       int reply = JOptionPane.showConfirmDialog(null, "You are about to exit the game, are you sure?", "Exit game", JOptionPane.YES_NO_OPTION); 
       if (reply == JOptionPane.YES_OPTION) { 
        System.exit(0); 
       } 

      } 

     } 


    } 
+0

看一看的JavaFX – Aaron

+0

ATM IM试图打破GIF到帧,使用定时器来改变它应该像一个流畅的动画帧 –

+1

你可以看一下这个网址[http://stackoverflow.com/问题/ 10836832/show-an-animated-bg-in-swing](http://stackoverflow.com/questions/10836832/show-an-animated-bg-in-swing) – SerefAltindal

回答

1

有两种方法如下:

  • 您可以覆盖您的JPanelpaintComponent()方法。 这样的:

@覆盖

protected void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     g.drawImage(yourImage, 0, 0, this); 

} 
  • 或者您也可以通过图像加载作为ImageIcon,然后在JLabel显示它使用JLabel
+0

早些时候我评论说我会把gif分解为帧(41),并用定时器函数逐个加载每一帧。如果我只是调用你在定时器中写的函数,它会工作得很好吗?或者需要其他编辑? –

+0

我不确定这是否可以在动画中使用,但是您可以随时在代码中尝试它,并查看它的结果。由于您正在制作动画,我强烈建议使用SwingWorker: https:// docs .oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html –

+0

当然会尝试您推荐的所有方法! :) –