-1

重複の可能性:フレームに独自のバッファリングされた画像を描画する
Javaスイングの背景画像

フレームに背景画像を追加しようとしていますが、何をしてもうまくいきません。

コンテナに複数のパネルを追加したスロット マシンを設計しました。今、素敵な背景をフレームに追加しようとしています。

ペイント法を使ってみました。しかし、私はすでにペイントメソッドを使用してリール画像をペイントしているため、背景には機能していません。

私も 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);
                }
            }
        }
    }
}
4

2 に答える 2

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

}
于 2012-11-15T16:26:29.903 に答える
3
  1. メインパネルのレイアウトをBorderLayout
  2. を作成JLabelしてメイン パネルに追加する
  3. 背景画像を使用してラベルの画像アイコンを設定します
  4. ラベルのレイアウトを使用したいものに設定します
  5. 通常どおり、コンポーネントをラベルに追加し続けます。

例はここにあります

于 2012-11-15T20:41:28.470 に答える