Java:将背景图像添加到框架

可能重复:
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  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. 像往常一样继续将组件添加到标签中

这里有一个例子

您可以简单地覆盖mainPanel paintComponent并在该方法中绘制背景图像。 您应该选择适当的策略来绘制图像(拉伸,保持纵横比,水平/垂直重复),但这不应该太难。

以下是在内容窗格上拉伸图像的示例。

 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://sofzh.miximages.com/java/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(); } } }); } }