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

时间:2018-08-16 17:54:40

标签: java jframe jpanel invisible jlayeredpane

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

当用户单击“输入”时,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");
            }
        });
    }
}

谢谢, 尤马哥罗

1 个答案:

答案 0 :(得分:1)

您所做的一切都正确,解决方案非常简单。当您将动态Component彼此动态添加时,必须使用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");
}