JButton исчезает, хотя он находится на другом слое, чем JLabel

В настоящее время я делаю настольную игру, похожую на шахматы, поэтому я сделал поле 11 * 11. В каждом поле должна быть кнопка JButton (на уровне по умолчанию), а на более высоком уровне — подвижная метка JLabel. Но этикетка все равно отталкивает кнопку. Вот упрощенный код:

public class Demo {

    public static void main(String[] args) {

        ImageIcon image = new ImageIcon("C:src\\myImage.png");

        JFrame frame = new JFrame();

        JPanel mainPanel = new JPanel();

        JLayeredPane[] tileLayeredPane = new JLayeredPane[121];

        JButton button = new JButton();

        JLabel label = new JLabel();

        label.setIcon(image);

        button.setText("I am not visible!");

        for (int i = 0; i < tileLayeredPane.length; i++) { // creates 121 JLabels

            tileLayeredPane[i] = new JLayeredPane();

            tileLayeredPane[i].setLayout(new BoxLayout(tileLayeredPane[i], BoxLayout.Y_AXIS));
            tileLayeredPane[i].setOpaque(true);
        } 

        tileLayeredPane[0].add(button, JLayeredPane.DEFAULT_LAYER);
        tileLayeredPane[0].add(label, JLayeredPane.PALETTE_LAYER);

        mainPanel.setLayout(new GridLayout(11, 11));

        for(int i = 0; i < 121; i++) {

            mainPanel.add(tileLayeredPane[i]);
        }

        frame.add(mainPanel);
        frame.setVisible(true);
    }

}

person Community    schedule 11.08.2018    source источник
comment
Зачем вам 121 JLayeredPanes?   -  person MadProgrammer    schedule 11.08.2018
comment
Да, это может показаться немного странным, но я хочу сделать доску, как в шахматах, и я не знаю лучшего способа сделать эти разные плитки.   -  person    schedule 11.08.2018
comment
Вы имеете в виду доску, подобную этой?   -  person c0der    schedule 11.08.2018


Ответы (1)


В каждом поле должна быть кнопка JButton (на уровне по умолчанию), а на более высоком уровне — подвижная метка JLabel.

Да, потому что вы используете BoxLayout для JLayeredPane, который решает, как должны быть расположены компоненты - JLayeredPane влияет только на порядок, в котором компоненты рисуются, а не на то, как они расположены.

Я «предполагаю», что вы пытаетесь поместить метку поверх кнопки, что вызывает вопрос: «Почему вы не используете встроенную поддержку изображений кнопок»?

person MadProgrammer    schedule 11.08.2018
comment
Я предполагаю, что вы пытаетесь поместить метку поверх кнопки, что вызывает вопрос, почему вы не используете встроенную поддержку изображений кнопок? Потому что в реальном приложении JLabel должен перемещаться по JLayeredPanes. Моя демонстрация просто не показывает этого. - person ; 11.08.2018
comment
@Peter, тогда тебе нужно избавиться от менеджера компоновки и взять его под свой контроль - person MadProgrammer; 11.08.2018
comment
Что ж, приложив немного усилий, вы можете использовать GridBagLayout для одного JLayeredPane и просто обновить GridBagConstraints для JLabel, чтобы изменить его положение в ячейке - что-то похожее на этот пример - но да, вы также можете написать свой собственный менеджер компоновки - но у меня может возникнуть соблазн сначала использовать GridBagLayout ;) - person MadProgrammer; 11.08.2018