设置图像背景 java

Set image background java

我最近开始在 SWING class 中编程,我尝试设置图像(如 Space)并在其上设置像背景一样的图像(如太空飞船)。我 希望你能帮助我,

这是我的代码

public class SpaceWar {

    static JFrame frame = new JFrame("Space War");
    static JPanel panel = new JPanel();

    public static void main(String[] args) {
        
        new SpaceWar();
        
        //frame.setResizable(false);
        frame.setVisible(true);
        
    }
    public SpaceWar() {
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
        Dimension size
        = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setPreferredSize(size);
        frame.setLayout(null);
        panel.setLayout(null);
        panel.setBounds(frame.getPreferredSize().width/4,0,
                frame.getPreferredSize().width/2,frame.getPreferredSize().height);
        frame.add(panel);
        frame.add(new Background());
        spaceShip sp1 = new spaceShip();
        panel.setBackground(Color.black);
        panel.add(sp1);

        System.out.println(panel.getPreferredSize().width);

    }
     
          
}   


class spaceShip extends JLabel{
    
    static ImageIcon img = new ImageIcon("spaceShip.png");

    public spaceShip(){
    
    sizeIcon(100,100,img);
    setIcon(img);
    
    }
    public static ImageIcon sizeIcon(int w,int h,ImageIcon image1){
        
        Image image = image1.getImage(); // transform it 
        Image newimg = image.getScaledInstance(w,h,  java.awt.Image.SCALE_SMOOTH); // scale it the smooth way  
        ImageIcon img1 = new ImageIcon(newimg);  // transform it back
        return img1;    
    }
}
class Background extends JPanel{
    
    public void paint(Graphics g) { // paint() method
          super.paint(g);
          ImageIcon image = new ImageIcon("space.jpg");
          Image bg = image.getImage();
          g.drawImage(bg,0,0,null);
          
    }
}

 

 

因此,您的“核心”问题是 null 布局的使用以及对组件大小和位置的了解不足。话虽如此,如果您的目标是制作游戏,那么这可能不是最好的方法。

相反,我会专注于创建一个“表面”,您可以在其上直接绘制所有资产,这会给您更大的控制权。

首先查看 Painting in AWT and Swing and Performing Custom Painting 以更好地了解绘画系统的工作原理以及如何使用它来执行自定义绘画。

我也会避免ImageIcon,这不是处理图像的最佳方式,相反,看看ImageIOReading/Loading an Image),它会生成一个IOException 如果图像无法加载并且将 return 完全实现的图像(不像 ImageIcon 将图像加载到后台线程)。

例如...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

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

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.add(new MainPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    public class MainPane extends JPanel {

        private BufferedImage ufo;
        private BufferedImage background;

        private int horizontalPosition = 106;

        public MainPane() throws IOException {
            ufo = ImageIO.read(getClass().getResource("/images/ufo.png"));
            background = ImageIO.read(getClass().getResource("/images/starfield.png"));
            System.out.println("background = " + background);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            paintBackground(g2d);
            paintUFO(g2d);
            g2d.dispose();
        }

        protected void paintBackground(Graphics2D g2d) {
            int x = (getWidth() - background.getWidth()) / 2;
            int y = (getHeight() - background.getHeight()) / 2;
            g2d.drawImage(background, x, y, this);
        }

        protected void paintUFO(Graphics2D g2d) {
            int x = (getWidth() - ufo.getWidth()) / 2;
            int y = (getHeight() - ufo.getHeight()) / 2;
            g2d.drawImage(ufo, x, y, this);
        }

    }
}

该示例使用了 embedded resources(需要继续阅读的内容)。以这种方式管理您的资产可以让您省去无数时间思考为什么它们不是 loading/working。如何实现这一点将取决于您的 IDE 和构建系统,例如,Netbeans 和 Eclipse 将允许您在不使用 maven 时将资源直接添加到 src 目录。

在某些时候,您会想了解 How to Use Swing Timers and How to Use Key Bindings