我正在尝试使用Java在Eclipse中设置背景图像

时间:2014-03-03 22:34:15

标签: java eclipse image swing background

我正在尝试使用Java在Eclipse中设置背景图像,我认为我已经完成了大部分工作。

我正在尝试制作2D游戏,并且我想在我的menuJFrame添加背景图片,您将在下面看到。

我已经有了这个代码:

这是我的主要课程JFrames

 import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;

    public class JFrames extends JPanel implements ActionListener {
    JFrame menuJFrame,howToPlayJFrame, level1JFrame;
    JPanel menuJPanel,howToPlayJPanel;
    JButton howToPlayButton,backToMainMenuButton,startGameButton, quitProgramButton;
    JLabel howToPlayLabel;

    public static void main(String [] args){
        JFrames jframes = new JFrames();
    }
    public JFrames(){
        //menuJFrame
        menuJFrame = new JFrame("SquareRun/Menu");
        menuJFrame.setVisible(true);
        menuJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        menuJFrame.setSize(800, 600);
        //menuJPanel
        menuJPanel = new JPanel();
        menuJFrame.add(menuJPanel);
        howToPlayButton = new JButton("How To Play");
        menuJPanel.add(howToPlayButton);
        howToPlayButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) 
            {
                if (e.getSource() == howToPlayButton){
                    howToPlayJFrame.setVisible(true);
                } 
            }});
        startGameButton = new JButton("Start Game");
        menuJPanel.add(startGameButton);
        startGameButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) 
            {
                if (e.getSource() == startGameButton)
                    level1JFrame.setVisible(true);
                menuJFrame.setVisible(false);
            }});
        quitProgramButton = new JButton("Quit Game");
        menuJPanel.add(quitProgramButton);
        quitProgramButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) 
            {
                if (e.getSource() == quitProgramButton){
                    menuJFrame.dispose();
                }
            }});
        //howToPlayJFrame
        howToPlayJFrame = new JFrame("SquareRun/HowToPlay");
        howToPlayJFrame.setVisible(false);
        howToPlayJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        howToPlayJFrame.setSize(600, 100);
        //howToPlayJPanel
        howToPlayJPanel = new JPanel();
        howToPlayJFrame.add(howToPlayJPanel);
        howToPlayLabel = new JLabel("Use the arrow keys to move, Up= jump, Down= down, Right= right, Left= left");
        howToPlayJPanel.add(howToPlayLabel);
        backToMainMenuButton = new JButton("Close Window");
        howToPlayJPanel.add(backToMainMenuButton);
        backToMainMenuButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) 
            {
                if (e.getSource() == backToMainMenuButton){
                    howToPlayJFrame.setVisible(false);
                    howToPlayJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                }}});
        //level1JFrame
        level1JFrame = new JFrame("Level 1");
        level1JFrame.setVisible(false);
        level1JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        level1JFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    }
    public void actionPerformed(ActionEvent e) {
    }
    public Object getCurrentLevel() {
        return null;
    }

}

这是我的背景课程:

import java.awt.Image;

import javax.swing.ImageIcon;

public class Background extends JFrames {
    private JFrames game;
    private Image image;

    public Background(JFrames game){
        this.game = game;
        image = (new ImageIcon("Image001.png")).getImage();

    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用此代码获取图像

image = (new ImageIcon(this.getClass().getResource("Image001.png"))).getImage();

假设带有图像的文件与此类位于同一文件夹中。

答案 1 :(得分:1)

不要创建以J开头的类,这只会让人感到困惑,特别是当有JFrame类时,你创建了一个名为JFrames的类,它从{{1}延伸现在我只是困惑......

您遇到的第一个问题是,您实际上并未将JPanel用于image类内的任何内容......

您问题的基本解决方案是使用Background作为后台组件,为其提供布局管理器并将组件添加到其中。

JLabel

然后您只需根据需要设置布局管理器并将组件添加到其中。

问题在于,调整组件大小时不会调整图像大小。为此,您需要提供一种方法来控制图像的绘制。

这将要求您从public class Background extends JLabel { public Background() { setIcon(new ImageIcon("Image001.png"))); // Don't forget to set the layout... } } 扩展Background类,并覆盖它的JPanel方法,并根据需要绘制图像。

查看Performing Custom Painting了解更多详情。

这将需要为图像提供某种缩放操作。虽然有许多方法可以在Java中扩展图像,但还是有许多问题需要注意。看看The Perils of Image.getScaledInstance()

这引发了一系列新问题,你想要缩放它们并保持纵横比吗?如果是这样,您是否希望将图像适合可用区域或填充它(因此它将始终覆盖可用空间)?

请查看Java: maintaining aspect ratio of JPanel background image了解详情。

我强烈建议您查看The Use of Multiple JFrames: Good or Bad Practice?http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html,这样可以帮助您减少令人困惑的用户体验,恕我直言。

您还应该看一下Reading/Loading an Image作为paintComponent的替代方案,因为它有能力读取更多文件格式,但是当它可以时也会抛出ImageIcon读取图像,这对诊断缺失的图像问题非常有帮助。