2012-11-15 90 views
-1

可能重複:
java swing background image
drawing your own buffered image on frame的Java:添加背景圖像幀

我想一回地面圖像添加到我的框架,但沒有什麼我也做作品。

我設計了一個由多個面板組成的老虎機添加到容器。現在,我正在嘗試爲框架添加一個不錯的背景。

我試過使用paint方法。但是,由於我已經使用繪畫方法繪製了卷軸圖像,因此它不適用於背景。

我也嘗試添加JLabel,但是當我這樣做時,它會覆蓋所有內容或被覆蓋,具體取決於我如何調用它。以下是我的代碼;任何幫助將非常感激:

import javax.swing.event.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import sun.audio.*; 

public class SlotMachine extends JFrame { 

    private Container c = getContentPane(); 

    private ImageIcon handleIcon = new ImageIcon("starWars/slot-handle.png"); 
    private ImageIcon quitIcon = new ImageIcon("starWars/quit2.jpg"); 
    private ImageIcon logoIcon = new ImageIcon("starWars/logo3.jpg"); 
    private ImageIcon BG = new ImageIcon("space.jpg"); 
    private JButton spin = new JButton("Spin", handleIcon); 
    private JButton quit = new JButton("Quit", quitIcon); 
    private JLabel logo = new JLabel(logoIcon); 
    private JLabel bankTotal = new JLabel("Empire Total"); 
    private JLabel bankLabel = new JLabel("$1000.00"); 
    private JLabel playerLabel = new JLabel("$1000.00"); 
    private JLabel playerTotal = new JLabel("Rebellion Total"); 
    private Font newFont = new Font("DialogInput",Font.ITALIC, 25); 
    private JPanel logoPanel = new JPanel(new BorderLayout()); 
    private JPanel moneyPanel = new JPanel(new GridLayout(1, 3, 5, 5)); 
    private JPanel imagePanel; 
    private JPanel mainPanel = new JPanel(new BorderLayout()); 
    private JPanel bankPanel = new JPanel(new GridLayout(2, 1, 5, 5)); 
    private JPanel playerPanel = new JPanel(new GridLayout(2, 1, 5, 5)); 
    private JPanel panel = new JPanel(new FlowLayout()); 
    private SlotMachine.ReelPanel reel1 = new SlotMachine.ReelPanel(); 
    private SlotMachine.ReelPanel reel2 = new SlotMachine.ReelPanel(); 
    private SlotMachine.ReelPanel reel3 = new SlotMachine.ReelPanel(); 
    private AudioPlayer audioPlayer = AudioPlayer.player; 
    private AudioDataStream continuousMusic; 
    private AudioDataStream winMusic; 
    private AudioDataStream force; 
    private AudioDataStream force2; 
    //private AudioDataStream intro; 
    private ContinuousAudioDataStream audioLoop; 
    private static final int DELAY = 1000; 
    private static final double FUNDS = 1000.00; 
    private static final float PRICE = 1; 
    private int timerCounter = 0; 
    private double bank = FUNDS; 
    private double playerMoney = 1000.00; 
    private Timer timer = new Timer(DELAY, new SlotMachine.TimeHandler()); 


public SlotMachine() { 

     try { 
      FileInputStream inputStream = new FileInputStream(new File("cantina4.wav")); 
      AudioStream audioStream = new AudioStream(inputStream); 
      AudioData audioData = audioStream.getData(); 
      continuousMusic = new AudioDataStream(audioData);    
      audioLoop = new ContinuousAudioDataStream(audioData); 

      inputStream = new FileInputStream(new File("Cheer.wav")); 
      audioStream = new AudioStream(inputStream); 
      audioData = audioStream.getData(); 
      winMusic = new AudioDataStream(audioData); 

      inputStream = new FileInputStream(new File("forceNN.wav")); 
      audioStream = new AudioStream(inputStream); 
      audioData = audioStream.getData(); 
      force = new AudioDataStream(audioData); 

      inputStream = new FileInputStream(new File("force2NN.wav")); 
      audioStream = new AudioStream(inputStream); 
      audioData = audioStream.getData(); 
      force2 = new AudioDataStream(audioData); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     audioPlayer.start(force);   

     // Set the font 
     spin.setFont(newFont); 
     quit.setFont(newFont); 
     bankLabel.setFont(newFont); 
     bankTotal.setFont(newFont); 
     playerLabel.setFont(newFont); 
     playerTotal.setFont(newFont); 

     // implements start button 
     spin.setVerticalTextPosition(SwingConstants.BOTTOM); 
     spin.setHorizontalTextPosition(SwingConstants.CENTER); 
     spin.setBackground(Color.GREEN); 
     spin.setForeground(Color.WHITE); 
     spin.setPreferredSize(new Dimension(100, 370)); 
     spin.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       audioPlayer.stop(force); 
       audioPlayer.stop(force2); 
       timer.start(); 
       reel1.startAnimation(); 
       reel2.startAnimation(); 
       reel3.startAnimation(); 
       spin.setEnabled(false); 
       audioPlayer.start(audioLoop); 
      } 
     }); 
     // implements quit button  
     quit.setBackground(Color.RED); 
     quit.setForeground(Color.WHITE); 
     quit.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       spin.setEnabled(true); 
       reel1.stopAnimation(); 
       reel2.stopAnimation(); 
       reel3.stopAnimation(); 
       timer.stop(); 
       audioPlayer.stop(continuousMusic); 
       audioPlayer.stop(audioLoop); 
       audioPlayer.stop(winMusic); 
       timerCounter = 0; 
       audioPlayer.stop(force); 
       audioPlayer.start(force2); 
       imagePanel.repaint(); // without this call for repaint, if you press quit but then choose to cancel 
       // the curent image and the next image would sometimes overlap this repaint may change the images but they do not overlap. 
       if (JOptionPane.showConfirmDialog(SlotMachine.this, 
         "Are you sure you want to quit?", "Quit Option", 
         JOptionPane.OK_CANCEL_OPTION) == 0) { 
        audioPlayer.start(force2); 
        System.exit(0); 
       } 
      } 
     }); 
     // create image panel 
     imagePanel = new JPanel(new GridLayout(1, 3, 15, 15)); 
     imagePanel.setBackground(Color.WHITE); 
     imagePanel.add(reel1); 
     imagePanel.add(reel2); 
     imagePanel.add(reel3); 

     // create a panel to hold bank values 
     bankTotal.setForeground(Color.WHITE); 
     bankLabel.setForeground(Color.WHITE); 
     bankPanel.setBackground(Color.GRAY); 
     bankPanel.add(bankTotal); 
     bankPanel.add(bankLabel); 

     // panel to hold player values 
     playerTotal.setForeground(Color.WHITE); 
     playerLabel.setForeground(Color.WHITE); 
     playerPanel.setBackground(Color.GRAY); 
     playerPanel.add(playerTotal); 
     playerPanel.add(playerLabel); 

     // create a panel to add bank and player panels and quit button 
     //moneyPanel.setBackground(Color.BLACK); 
     moneyPanel.add(bankPanel); 
     moneyPanel.add(playerPanel); 
     moneyPanel.add(quit); 
     moneyPanel.setOpaque(false); 

     // this panel adds the reel panel and spin button 
     panel.setPreferredSize(new Dimension(650, 350)); 
     //panel.setBackground(Color.BLACK); 
     panel.add(imagePanel); 
     panel.add(spin); 
     panel.setOpaque(false); 

     // create the logo panel 
     logoPanel.add(logo); 
     //logoPanel.setBackground(Color.BLACK); 
     logoPanel.setOpaque(false);   

     mainPanel.add(logoPanel, BorderLayout.NORTH); 
     mainPanel.add(panel, BorderLayout.CENTER); 
     mainPanel.add(moneyPanel, BorderLayout.SOUTH); 
     mainPanel.setOpaque(false);    

     //////////////////////////////////// background ??????????????????? 
     /// I could just set backgroung black but i want to add a image 


     add(mainPanel, BorderLayout.CENTER); 

     setTitle("Slot Machine"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setSize(950, 750); 
     setResizable(false); 
     setLocationRelativeTo(null);      

    } 

    public static void main(String[] args) { 
     new SlotMachine(); 
    } 

    public class ReelPanel extends JPanel { 

     private final static String IMAGE_NAME = "starWars/icon"; 
     protected ImageIcon images[]; 
     private int currentImage = 0; 
     private final int ANIMATION_DELAY = 150; 
     private final int TOTAL_IMAGES = 12; 
     private int width; 
     private int height; 
     private Timer animationTimer = new Timer(ANIMATION_DELAY, new SlotMachine.ReelPanel.TimerHandler()); 
     private int index; 

     public ReelPanel() { 
      try { 
       images = new ImageIcon[TOTAL_IMAGES]; 
       for (int count = 0; count < images.length; count++) { 
        images[ count] = new ImageIcon(IMAGE_NAME + (count + 1) + ".jpg"); 
       } 

       width = images[ 1].getIconWidth(); 
       height = images[ 1].getIconHeight(); 
       currentImage = 0; 
       index = 0; 
       animationTimer.setInitialDelay(0); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     public void paintComponent(Graphics g) { 

      super.paintComponent(g); 

      images[ currentImage].paintIcon(this, g, 0, 0); 

      if (animationTimer.isRunning()) { 
       currentImage = (int) (Math.random() * TOTAL_IMAGES); 
      } 
     } 

     public void startAnimation() { 

      animationTimer.start(); 
     } 

     public void stopAnimation() { 
      animationTimer.stop(); 
     } 

     public int getIndex() { 
      return index; 
     } 

     public Dimension getMinimumSize() { 
      return getPreferredSize(); 
     } 

     public Dimension getPreferredSize() { 
      return new Dimension(width, height); 
     } 

     private class TimerHandler implements ActionListener { 

      public void actionPerformed(ActionEvent actionEvent) { 
       repaint(); 
       index = currentImage; 
      } 
     } 
    } 

    private class TimeHandler implements ActionListener { 

     public void actionPerformed(ActionEvent actionEvent) { 
      audioPlayer.stop(winMusic); 
      ++timerCounter; 
      if (timerCounter == 2) { 
       reel1.stopAnimation(); 
      } else if (timerCounter == 3) { 
       reel2.stopAnimation(); 
      } else if (timerCounter == 4) { 
       reel3.stopAnimation(); 
       audioPlayer.stop(continuousMusic); 
       audioPlayer.stop(audioLoop); 
       timerCounter = 0; 
       timer.stop(); 
       spin.setEnabled(true); 
       if (reel1.getIndex() == reel2.getIndex() && reel1.getIndex() == reel3.getIndex()) { 
        if (playerMoney > 0) { 
         playerMoney += bank; 
        } else { 
         playerMoney = bank; 
        } 
        bank = FUNDS; 
        winMusic.reset(); 
        audioPlayer.start(winMusic); 
       } else { 
        bank += PRICE; 
        playerMoney -= PRICE; 
       } 

       bankLabel.setText("$" + bank + 0); 
       playerLabel.setText("$" + playerMoney + 0); 
       if (playerMoney <= 0) { 
        JOptionPane.showMessageDialog(SlotMachine.this, 
          "You are out of funds. GAME IS OVER", "Error", JOptionPane.ERROR_MESSAGE); 
        System.exit(1); 
       } 
      } 
     } 
    } 
} 
+0

[上框架繪製自己的緩衝圖像]的可能的複製(http://stackoverflow.com/questions/11163925/drawing-your-own-buffered-image-on-框架)或http://stackoverflow.com/questions/2227423/java-swing-background-image或http://stackoverflow.com/questions/11853921/setting-a-background-image-on-a-jframe-using -swing或..請先搜索答案。 –

回答

3
  1. 設置你的主面板的佈局BorderLayout
  2. 創建JLabel並將其添加到您主面板
  3. 使用背景圖片
  4. 設置設置標籤的圖像圖標標籤的佈局以便您想要使用
  5. 繼續將組件添加到標籤中,就像您通常會使用的那樣

一個例子可以發現here

+0

感謝您的完美幫助。 – rafaelzm2000

6

你可以簡單地覆蓋paintComponentmainPanel,並在該方法中繪製背景圖像。您應該選擇適當的策略來繪製圖像(拉伸,保持縱橫比,水平/垂直重複),但這不應該太難。

下面是一個在內容窗格中延伸圖像的示例。

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestBackgroundImage { 

    private static final String BACKHGROUND_IMAGE_URL = "http://cache2.allpostersimages.com/p/LRG/27/2740/AEPND00Z/affiches/blue-fiber-optic-wires-against-black-background.jpg"; 

    protected void initUI() throws MalformedURLException { 
     JFrame frame = new JFrame(TestBackgroundImage.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final ImageIcon backgroundImage = new ImageIcon(new URL(BACKHGROUND_IMAGE_URL)); 
     JPanel mainPanel = new JPanel(new BorderLayout()) { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.drawImage(backgroundImage.getImage(), 0, 0, getWidth(), getHeight(), this); 
      } 

     @Override 
     public Dimension getPreferredSize() { 
      Dimension size = super.getPreferredSize(); 
      size.width = Math.max(backgroundImage.getIconWidth(), size.width); 
      size.height = Math.max(backgroundImage.getIconHeight(), size.height); 
      return size; 
     } 

     }; 
     mainPanel.add(new JButton("A button"), BorderLayout.WEST); 
     frame.add(mainPanel); 
     frame.setSize(400, 300); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        new TestBackgroundImage().initUI(); 
       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 
+0

我試過你的建議,但它不適用於我的項目。但謝謝你的幫助。 – rafaelzm2000

+0

@ rafaelzm2000如果你已經嘗試了上面的代碼,你顯然看到它的工作原理。所以,無論你的孩子的組件是否覆蓋了整個框架,在這種情況下,你的問題沒有意義(背景圖像在哪裏可見?),或者你沒有在你的案例中正確設置它。嘗試在問題中發佈[SSCCE](http://sscce.org)。 –

+0

你是對的代碼確實工作,但我實施我自己的代碼時,我必須做錯了什麼,因爲背景是空白的。代碼現在正在工作,但我會嘗試再次使用您的示例,看看我是否可以正確使用它。再一次感謝你的幫助。 – rafaelzm2000