JLabel попадает на верхний слой, когда его свойство изменилось - PullRequest
0 голосов
/ 16 апреля 2020

есть какая-то проблема в моем разгаре? программа. Я искал его здесь, но ответа нет, поэтому я публикую это.

Вот пример кода:

public class main{

    private static JFrame frame;

    private static JLayeredPane layered;

    private static JPanel panel1;
    private static JPanel panel2;
    private static JPanel bg_change;
    private static JLabel txt_bg;
    private static JLabel txt_change;

    private static JButton btnBG;
    private static JButton btnTEXT;

    public static void main(String[] args) {

        frame = new JFrame();
        frame.setBounds(0,0,500,500);
        frame.setVisible(true);
        frame.setLayout(null);


            layered = new JLayeredPane();
            layered.setBounds(0,0,frame.getWidth(),frame.getHeight());
            layered.setLayout(null);
            layered.setOpaque(true);
            layered.setBackground(Color.GRAY);
            frame.add(layered);

                panel1 = new JPanel();
                panel1.setBounds(10,10,300,300);
                panel1.setOpaque(true);
                panel1.setLayout(null);
                panel1.setBackground(Color.RED);
                layered.add(panel1,0);

                    btnBG = new JButton("BTN_BG");
                    btnBG.setBounds(100,50,0,0);
                    btnBG.setSize(btnBG.getPreferredSize());
                    panel1.add(btnBG);

                    btnTEXT = new JButton("BTN_TXT");
                    btnTEXT.setBounds(100,100,0,0);
                    btnTEXT.setSize(btnTEXT.getPreferredSize());
                    panel1.add(btnTEXT);

                panel2 = new JPanel();
                panel2.setBounds(50,50,300,300);
                panel2.setOpaque(true);
                panel2.setLayout(null);
                panel2.setBackground(Color.BLUE);
                layered.add(panel2,1);

                    bg_change = new JPanel();
                    bg_change.setBounds(240,240,50,50);
                    bg_change.setOpaque(true);
                    bg_change.setLayout(null);
                    bg_change.setBackground(Color.ORANGE);

                    txt_change = new JLabel("TESTTESTETST");
                    txt_change.setBounds(240,30,0,0);
                    txt_change.setSize(txt_change.getPreferredSize());
                    txt_change.setOpaque(false);

                    panel2.add(bg_change);
                    panel2.add(txt_change);


        frame.repaint();
        addListner();

    }

    public static void addListner() {
        btnBG.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                bg_change.setBackground(Color.GREEN);

            }
        });

        btnTEXT.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                txt_change.setText("CLICKCLICKCLICKK");
                txt_change.setSize(txt_change.getPreferredSize());
            }
        });
    }
}

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

спасибо за чтение.

1 Ответ

0 голосов
/ 16 апреля 2020

Две проблемы:

  1. параметр "int" отличается от параметра "Integer". Многоуровневая панель ожидает, что вы будете использовать Integer, чтобы указать ограничение для слоя. Прочитайте API Container.add(…) для различных перегруженных методов, чтобы увидеть разницу между "int" и "Object" в качестве параметра для метода add (…).
  2. компоненты с более высоким значением Integer изображены сверху .

Итак, пара изменений:

//layered.add(panel1, 0);
layered.add(panel1, new Integer(1));

...

//layered.add(panel2,1);
layered.add(panel2, new Integer(0));

Кроме того, вам НЕ следует использовать все переменные и методы stati c. Это признак плохого дизайна.

Я предлагаю вам прочитать раздел из учебника Swing по Как использовать многоуровневые панели для получения дополнительной информации и примеров с более структурированным кодом.

...