JLabel 在其 属性 更改时进入顶层

JLabel get on top layer when its property changed

我的挥杆有问题吗?程序。 我在这里搜索但没有答案所以我 post 这个。

这里是示例代码:

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. "int" 参数不同于 "Integer" 参数。分层窗格希望您使用整数来指定层的约束。阅读 Container.add(…) API 了解不同的重载方法,了解 "int" 和 "Object" 作为 add(...) 方法参数的区别。
  2. 具有较高整数值的组件被绘制在顶部。

所以有一些变化:

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

...

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

此外,您不应该使用所有静态变量和方法。这表明设计不佳。

我建议您阅读 Swing 教程中关于 How to Use Layered Panes 的部分,以获取更多信息和结构更好的代码示例。