如何在背景中将按钮放在分层更改图像上

时间:2014-08-20 20:24:34

标签: java image button layered

我和我的朋友正在制作一款游戏,我们希望在背景中拥有分层图像,并在这些图像上按钮浏览它们。一个图像可以保持不变,而另一个图像不断变化。为此,我认为渲染和刻度哲学会很棒。

对于那些从日本看过那些俗气的视觉小说游戏的人来说,这基本上就是我们正在努力的。

更新:所以我在下面使用了很多你的建议。我的新问题是我的JButton会在我滚动之前消失在图片下面。当我按照建议添加super.paintComponent(g)时,一切都会在出现时立即消失。

我的main方法的代码目前看起来像这样:

package Urban.Blade.Package;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import Urban.Blade.Package.gfx.*;
import javax.swing.*;

public class MainGame extends JPanel{
    private static final long serialVersionUID = 1L;
    public static final int WIDTH = 300, HEIGHT = 300, SCALE = 2, PICSCALE = 0;
    public BufferedImage background1;
    public BufferedImage testCharacter1;
    static JButton b1 = new JButton();
    static JButton b2 = new JButton();
    static JPanel j1 = new JPanel();
    static JPanel j2 = new JPanel();
    static JFrame frame = new JFrame("Urban Blade");
    static MainGame mGame = new MainGame();
    static JLayeredPane lJ = new JLayeredPane();
    static JLayeredPane lJ2 = new JLayeredPane();


    public static void main(String[] args){ 
        lJ.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        lJ.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        lJ.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        lJ.setBounds(0, 0, WIDTH * SCALE, HEIGHT * SCALE);

        mGame.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        mGame.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        mGame.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        mGame.setBounds(0, 0, WIDTH * SCALE, HEIGHT * SCALE);

        frame.setSize(WIDTH * SCALE, HEIGHT * SCALE);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        lJ.setLayout(null);

        frame.add(mGame);
        frame.add(lJ);

        j2.setLayout(new GridLayout());
        j2.setSize(WIDTH * SCALE, HEIGHT * SCALE);
        j2.setLocation(0, 0);

        j1.setLayout(new GridLayout());
        j1.setSize(100, 25);
        j1.setLocation(225*SCALE, 250*SCALE);
        j1.add(b1);
        b1.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent me) {
                System.out.println("CLICKED");
            }
        });


        frame.setVisible(true);

        lJ.add(j2);
        lJ.add(j1);
        lJ.setComponentZOrder(j2, 1);
        lJ.setComponentZOrder(j1, 0);
        mGame.init();
        mGame.paintComponent();
    }

    public void init(){
        ImageLoader loader = new ImageLoader();
        background1 = loader.load(new File("res/testBackground.png"));
        testCharacter1 = loader.load(new File("res/testForeground.png"));


    }

    public void paintComponent(){
        Graphics g = j2.getGraphics();

        g.drawImage(background1, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
        g.drawImage(testCharacter1, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);

        super.paintComponent(g);

        g.dispose();
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题是您正在尝试将常规GUI绘图与BufferStrategy中的自定义绘图混合使用。如果您使用的是BufferStrategy,则更新/绘制操作不起作用。一个选项是使用普通的paint / paintComponent覆盖和空布局管理器,这样您就可以将按钮放在任何位置,并在其后面绘制图像。

如果您想继续使用BufferStrategy,可以尝试手动调用在Graphics对象中传递的paint。不确定这是否有效,因为我从未尝试过。

如果您使用第一个选项,则必须确保JPanel具有透明背景而不是不透明。绘制图像后还必须调用super.paint(),以便在自定义绘图后显示JDK绘图,按钮将显示在顶部。