Java:将背景图像添加到框架 [英] Java: Add Background image to frame

查看:137
本文介绍了Java:将背景图像添加到框架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可能重复:
java swing背景图像
在框架上绘制自己的缓冲图像

Possible Duplicate:
java swing background image
drawing your own buffered image on frame

我正在尝试将背景图像添加到我的框架中,但是我没有做任何工作.

I am trying to add a back ground image to my frame, but nothing that I have done works.

我设计了一种老虎机,该老虎机由添加到容器中的几个面板组成.现在,我正在尝试为框架添加漂亮的背景.

I designed a slot machine consisting of several panels added to the container. Now, I am trying to add a nice background to the frame.

我尝试使用绘画方法.但是,由于我已经在使用绘制方法绘制卷轴图像,因此它无法在背景上运行.

I tried using the paint method. But, since I am already using the paint method to paint the reel images, it is not working on the background.

我也尝试添加JLabel,但是当我这样做时,它会覆盖所有内容或被覆盖,这取决于我如何称呼它.以下是我的代码;任何帮助将不胜感激:

I also tried adding a JLabel, but when I do it overwrites everything or get overwritten depending on how I call it. Following is my code; any help will be much appreciated:

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);
                }
            }
        }
    }
}

推荐答案

  1. 将主面板的布局设置为BorderLayout
  2. 创建一个JLabel并将其添加到您的主面板中
  3. 使用背景图像设置标签的图像图标
  4. 将标签的布局设置为您要使用的标签
  5. 像往常一样继续将组件添加到标签中
  1. Set the layout of your main panel to BorderLayout
  2. Create a JLabel and add it to you main panel
  3. Set the image icon of the label using your background image
  4. Set the layout of the label to what ever you want to use
  5. Continue adding your components to the label as you normally would

可以在此处

这篇关于Java:将背景图像添加到框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆