将多个JPanel添加到JLayeredPane

时间:2017-05-22 10:05:02

标签: java swing

我正在写国际象棋程序。为了显示棋盘,我使用了两个JPanel s:

  1. 棋盘:此面板显示空棋盘的图像
  2. 西洋棋棋子:此面板显示带有西洋棋棋子图像的JLabel数组
  3. 因此,我需要将两个面板放在一起。因此我目前正在使用JLayeredPane。但问题是我只能同时查看其中一个图层。

    我目前的构造函数代码是:

    public ChessBoard(){
    
        setLayout(new FlowLayout());
    
        gamescreen = new JLayeredPane();
        gamescreen.setPreferredSize(new Dimension(200,200));
    
        chessboard = new JPanel(new GridBagLayout());
        chessmen = new JPanel(new GridBagLayout());
    
        //chessboard.setLocation(0, 0);
        //chessmen.setLocation(0,0);
    
        chessboardImage = new ImageIcon(getClass().getResource("chessboard.jpg"));
        chessboardDisplay = new  JLabel(chessboardImage);
    
        chessboard.add(chessboardDisplay);
        GridBagConstraints constraint = new GridBagConstraints();
    
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
    
                imageSet[i][j] = new ImageIcon(getClass().getResource(""+i+(j+1)+".png"));
                image = imageSet[i][j].getImage().getScaledInstance(100, 100, Image.SCALE_SMOOTH);
                imageSet[i][j]= new ImageIcon(image);
            }
        }
        for(int i=0;i<2;i++){
            constraint.gridy=i+3000;
            for(int j=0;j<2;j++){
                chessmenPos[i][j] = new JLabel(imageSet[i][j]);
                constraint.gridx=j;
                chessmen.add(chessmenPos[i][j],constraint);
            }
    
            chessboard.setBounds(0, 0, 200, 200);
            chessmen.setBounds(0, 0, 200, 200);
    
    
            gamescreen.add(chessboard, 1);
            gamescreen.add(chessmen, 0);
    
            gamescreen.setOpaque(false);
            chessboard.setVisible(true);
            chessmen.setVisible(true);
            add(gamescreen);
        }
    
        EventHandling eventHandler = new EventHandling();
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
                chessmenPos[i][j].addMouseListener(eventHandler);
    
    } 
    

    我哪里出错了,我可以做些什么改变?

1 个答案:

答案 0 :(得分:2)

  

但问题是我只能同时查看其中一个图层。

顶层需要透明。所以你需要:

chessmen.setOpaque( false );

您可以查看:Asking for some clarification in java about jlabel and parent以获取简单棋盘的示例。它使用略有不同的方法。每个方块都是一个组件。