无法在 JFrame 的构造函数之外将 JPanel 添加到 JLayeredPane

JPanel can't be added to JLayeredPane outside the JFrame's constructor

我想在用户单击输入时将 JPanel 添加到 JLayeredPane,但 JPanel 未显示。 如果我在 JFrame 的构造函数中将 JPanel 添加到 JLayeredPane,则一切正常。

当用户单击 'enter' 时,JPanel 正在显示,我该怎么办?

代码如下:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class Test extends javax.swing.JFrame {

    public static void main(String[] args) {
        Test test = new Test();
        test.setSize(800, 500);
        test.setVisible(true);
    }

    public Test() {
        setLayout(new BorderLayout());

        //LayeredPane on JFrame
        JLayeredPane jlp = new JLayeredPane();
        jlp.setLayout(new BorderLayout());
        this.add(jlp, BorderLayout.CENTER);

        //Adds a JPanel to the North
        JPanel jPNorth = new JPanel();
        jPNorth.setBackground(Color.RED);
        jlp.add(jPNorth, BorderLayout.NORTH, JLayeredPane.DEFAULT_LAYER);

        //Adds Enter Keybinding
        InputMap key_input_map = jlp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        ActionMap key_action_map = jlp.getActionMap();

        key_input_map.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), "add_jpanel");

        key_action_map.put("add_jpanel", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {

                JPanel jPSouth = new JPanel();
                jPSouth.setBackground(Color.YELLOW);
                jlp.add(jPSouth, BorderLayout.SOUTH, JLayeredPane.DEFAULT_LAYER);

                System.out.println("enter");
            }
        });
    }
}

谢谢, 重麻五郎

你做的都对,解决方法很简单。当你动态添加 swing Components 时,你必须使用 component.repaint();component.revalidate(); 来重绘元素。添加完所有内容后添加这两个命令。因此,您的 actionPerformed 方法应更改为以下内容:

public void actionPerformed(ActionEvent e) {
    JPanel jPSouth = new JPanel();
    jPSouth.setBackground(Color.YELLOW);
    jlp.add(jPSouth, BorderLayout.SOUTH, JLayeredPane.DEFAULT_LAYER);
    //Need these to here!
    jlp.repaint();
    jlp.revalidate();
    System.out.println("enter");
}