在后台设置面板,在前台设置另一个面板

问题描述 投票:0回答:1

我的团队项目有点问题,在这个项目中我们必须制作一个游戏。我有2个面板用于背景与地图(从json创建)和另一个面板与角色。我已尝试使用jlayeredpane,但地图不在我的jframe中心。我也尝试过.setOpaque(true / false),但它不起作用。有谁有想法?

这是我的代码:

package vue;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.Hashtable;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JLayeredPane;
import org.json.*;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import controler.abstractControler;

import observer.Observer;

public class gamingArea extends JPanel implements Observer {
    private String ressourcesImg = "resources/images/";
    private Hashtable <String,String> tile = new Hashtable();
    private abstractControler controler;
    private JSONParser parser = new JSONParser();
    private JSONArray map ;

    private JPanel centerPanel,topPanel,playerPanel,mapPanel,centerContentPanel;

    private GridBagLayout centerLayout,topLayout;
    private GridLayout mapLayout,playerLayout;
    private BorderLayout divider;
    private JLabel banniereLabel;
    private BufferedImage banniere;

    public gamingArea(abstractControler controler) {
        this.controler = controler;
        //getting the image from system file
        try {
            banniere = ImageIO.read(new File(ressourcesImg+"banniere.png"));
            banniereLabel = new JLabel(new ImageIcon(banniere));
        } catch (IOException e) {
            banniereLabel = new JLabel();
            banniereLabel.setText("error file can't be read");
            e.printStackTrace();
        }
        //getting the map in json format
        try {
            map = (JSONArray) ((JSONObject) parser.parse(new FileReader("resources/cartes/carte.json"))).get("boite");
        } catch (FileNotFoundException e) {         
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //init Jpanel
        centerPanel = new JPanel();
        topPanel = new JPanel();
        playerPanel = new JPanel();
        mapPanel = new JPanel();
        centerContentPanel = new JPanel(new CardLayout());

        //init layout
        centerLayout = new GridBagLayout();
        topLayout = new GridBagLayout();

        divider = new BorderLayout();

        playerLayout = new GridLayout(map.size(),map.size());
        mapLayout = new GridLayout(map.size(),map.size());


        //setting layout
        this.setLayout(divider);
        centerPanel.setLayout(centerLayout);
        topPanel.setLayout(topLayout);
        mapPanel.setLayout(mapLayout);
        playerPanel.setLayout(playerLayout);


        //setting the hasmap
        tile.put("1",ressourcesImg+"sol.png");
        tile.put("2",ressourcesImg+"mur.png");

        //defining layout which show the map        
        for (int i = 0; i < map.size(); i++) {
            ArrayList<String> line= (ArrayList<String>) map.get(i);
            for (int j = 0; j < line.size(); j++) {
                try {
                    BufferedImage tempBuf = ImageIO.read(new File(tile.get(line.get(j))));
                    JLabel temp =  new JLabel(new ImageIcon(tempBuf));
                    mapPanel.add(temp);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        //adding a player sample
        BufferedImage testb;
        try {
            testb = ImageIO.read(new File(ressourcesImg+"snake_tete_invisible.png"));
            JLabel test =  new JLabel(new ImageIcon(testb));
            playerPanel.add(test);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //setting panels opaque or not
        mapPanel.setOpaque(true);
        playerPanel.setOpaque(false);
        //adding components to main panels 
        //centerContentPanel.add(mapPanel);
        //centerContentPanel.add(playerPanel);
        centerPanel.add(centerContentPanel);
        topPanel.add(banniereLabel);
        this.add(topPanel,divider.PAGE_START);
        this.add(mapPanel,divider.CENTER);
        this.add(playerPanel,divider.CENTER);       
    }
    @Override
    public void update(String str) {
        // TODO Auto-generated method stub
    }

    @Override
    public void changePanel(String nomPanel) {
        // TODO Auto-generated method stub
    }


}
java swing
1个回答
0
投票

我已经找到了解决方案,所以对于那些想要在这里知道解决方案的人来说,在Java中创建一个没有库的磁贴图:使用类似的Json创建地图:

{"box":[
       ["2","2","2","2","2","2","2","2","2","2"]
       ["2","1","1","1","1","1","1","1","1","2"]
       ["2","1","1","1","1","1","1","1","1","2"]
       ["2","1","1","1","1","1","1","1","1","2"]
       ["2","1","1","1","1","1","1","1","1","2"]
       ["2","1","1","1","1","1","1","1","1","2"]
       ["2","1","1","1","1","1","1","1","1","2"]
       ["2","1","1","1","1","1","1","1","1","2"]
       ["2","1","1","1","1","1","1","1","1","2"]
       ["2","2","2","2","2","2","2","2","2","2"]
       ]
}

以box表的大小创建gridLayout,其中2设置为墙的图像,1设置为草的图像

然后获得一个不可见的图块,并在第一个图块的大小处制作第二个gridlayout。最后你只需要用JLayeredPane将它设置在它上面,并用你的角色替换由gridlayout给出的cordinate的invisibile tile。

© www.soinside.com 2019 - 2024. All rights reserved.