JLayeredPane не отображается должным образом

#java #swing #jlayeredpane

#java #качать #jlayeredpane

Вопрос:

Я программирую графический интерфейс для шахматной игры, я использую JLayeredPane для отображения черно-белых плиток на JFrame, а затем на следующем слое JLayeredPane я бы отображал шахматные фигуры, я новичок в Jlayeredpane и не совсем понимаю, как его использовать, я не могу заставить слой pieces накладываться на слой tiles, я попытался установить непрозрачность как false, и я попытался установить цвет фона как 0,0,0,0 есть идеи?

Я создал jpanel, который содержит массив jpanels с черно-белым фоном, затем я создал другую jpanel, которая содержит массив jlabels, на jlabels есть тексты, отображающие шахматные фигуры.

Общий код:

 class frame extends JFrame implements MouseListener, MouseMotionListener{

private JLabel[][]label;

private int xIndex;

private int yIndex;

private JPanel[][]panels;

private JPanel mainPanel;

private JPanel labelPanel;

    public frame() {    
        super("Chessboard");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        label = new JLabel[8][8];
        mainPanel = new JPanel();
        panels = new JPanel[8][8];
        labelPanel = new JPanel();
        mainPanel.setLayout(new GridLayout(8,8));
        addTiles();
        labelPanel.setLayout(new GridLayout(8,8));
        addButtons();
        JLayeredPane mainPane = new JLayeredPane();
        add(mainPane);
        mainPane.add(mainPanel,1);
        mainPane.add(labelPanel, 2);
        setBoard();
        setSize(new Dimension(500,500));
        setVisible(true);
    }

    public void setBoard(){

         label[0][0].setText("u2656");
         label[0][7].setText("u2656");
         label[0][1].setText("u2658");
         label[0][2].setText("u2657");
         label[0][3].setText("u2655");
         label[0][4].setText("u2654");
         label[0][5].setText("u2657");
         label[0][6].setText("u2658");
         label[7][0].setText("u265C");
         label[7][1].setText("u265E");
         label[7][2].setText("u265D");
         label[7][3].setText("u265B");
         label[7][4].setText("u265A");
         label[7][5].setText("u265D");
         label[7][6].setText("u265E");
         label[7][7].setText("u265C");

         for(int i =0; i <8 ;i  ){
             label[1][i].setText("u2659");

         }

         for(int i =0; i <8 ;i  ){
             label[6][i].setText("u265F");

         }

    }

    public void addTiles(){

            for(int i =0; i<8;i  ){


            for(int k =0; k<8;k  ){

            panels[i][k] = new JPanel();

                if(i%2 == 1){

                    if(k%2 == 0){

        panels[i][k].setBackground(Color.gray);

        }else{

        panels[i][k].setBackground(Color.WHITE);

        }

        }else{

                    if(k%2 == 1){

                    panels[i][k].setBackground(Color.gray);

                    }else{

                    panels[i][k].setBackground(Color.WHITE);

                    }

                }

                mainPanel.add(panels[i][k]);

            }

            }

    }

    public void addButtons(){

        for(int i =0; i<8;i  ){
            for(int k =0; k<8;k  ){

                label[i][k] = new JLabel();

                label[i][k].setLayout(null);

    label[i][k].setFont(label[i][k].getFont().deriveFont(29f));

                label[i][k].addMouseListener(this);

                label[i][k].addMouseMotionListener(this);

                labelPanel.add(label[i][k]);

            }


        }
    }

    public void findIndex(MouseEvent arg0){

        for(int x =0; x<8;x  ){

            for(int y =0; y <8; y  ){

                if(arg0.getSource().equals(label[x][y])){

                    xIndex = x;

                    yIndex = y;


                }   
            }   
        }   
    }

    public void mouseDragged(MouseEvent arg0) {

        findIndex(arg0);

        int mouseX = arg0.getX();

        int mouseY = arg0.getY();

        label[xIndex][yIndex].setLocation(mouseX, mouseY);
    }
  

Я хочу, чтобы слой pieces отображался поверх слоя tiles из черно-белых jpanels и чтобы цвета были видны.

Комментарии:

1. Не используйте JLayeredPane. Вместо этого используйте простую сетку JPanel для размещения шахматной доски, сделайте фигуры JLabels, и если вы хотите снять фигуры с доски, поместите их в стеклянную панель JFrame. На самом деле это использование JLayeredPane за кулисами, но это проще сделать.

2. должен ли я создать другую панель для стеклянной панели? извините, я не знаком со стеклянными панелями.

3. Нет, вы этого не делаете. Пожалуйста, посмотрите это, поскольку это хорошо объяснено в удобных для поиска руководствах и тому подобном