2016-08-03 3 views
0

im делает математическую игру и хочет использовать 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 им пытается разбить 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

Есть два способов сделать это:

  • вы можете переопределить метод paintComponent() вашего JPanel. так:

@Override

protected void paintComponent(Graphics g) { 

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

} 
  • или вы можете использовать JLabel путем загрузки изображения в качестве ImageIcon, а затем отображать его в JLabel.
+0

Раньше я прокомментировал, что сломаю gif на фреймы (41) и загружаю каждый кадр один за другим с помощью функции таймера. Если я просто вызову функцию u, написанную в таймере, она будет работать нормально? Или любые другие изменения будут необходимы? –

+0

Я не уверен, что это может работать в анимации, но вы всегда можете попробовать его в своем коде и посмотреть, как это получается. Поскольку вы делаете анимацию, я настоятельно рекомендую использовать SwingWorker: https: // docs .oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html –

+0

Конечно, попробуем все ваши рекомендации! :) –

Смежные вопросы