Java jPanel未出现在jLayeredPane内

Java jPanel未出现在jLayeredPane内,java,swing,dynamic,jpanel,jlayeredpane,Java,Swing,Dynamic,Jpanel,Jlayeredpane,我已经阅读了关于这个问题的所有主题,但我不知道问题出在哪里 下面的代码在一个方法中,该方法在单击按钮时被调用,按钮是动态生成的,控制台输出显示为yes,因此该方法被调用 System.out.println("loaditems method"); final JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension(436, 480)); panel.setLayout(new Flow

我已经阅读了关于这个问题的所有主题,但我不知道问题出在哪里

下面的代码在一个方法中,该方法在单击按钮时被调用,按钮是动态生成的,控制台输出显示为yes,因此该方法被调用

    System.out.println("loaditems method"); 
    final JPanel panel = new JPanel();
    panel.setPreferredSize(new Dimension(436, 480));
    panel.setLayout(new FlowLayout(FlowLayout.LEFT,5,5));
    panel.setBackground(Color.gray);
    panel.setBorder(BorderFactory.createEtchedBorder(LOWERED, Color.lightGray, Color.gray));
    panel.setOpaque(false);
    panel.setLocation(jMainPanel.getLocation());
    panel.setVisible(true);
    jLayeredPane1.add(panel);
    jLayeredPane1.revalidate();

JLayeredPane
默认情况下使用空布局。因此,您应该实现自己的
LayoutManager
来设置
JLayeredPane
中每个组件的边界

请参见此示例:

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestJLayeredPane {

    public static class AbsoluteLayoutManager implements LayoutManager {

        private Map<Component, Rectangle> bounds = new LinkedHashMap<Component, Rectangle>();

        @Override
        public void addLayoutComponent(String name, Component comp) {
            bounds.put(comp, new Rectangle(comp.getPreferredSize()));
        }

        @Override
        public void removeLayoutComponent(Component comp) {
            bounds.remove(comp);
        }

        @Override
        public Dimension preferredLayoutSize(Container parent) {
            Rectangle rect = new Rectangle();
            for (Rectangle r : bounds.values()) {
                rect = rect.union(r);
            }
            return rect.getSize();
        }

        @Override
        public Dimension minimumLayoutSize(Container parent) {
            return preferredLayoutSize(parent);
        }

        @Override
        public void layoutContainer(Container parent) {
            for (Entry<Component, Rectangle> e : bounds.entrySet()) {
                e.getKey().setBounds(e.getValue());
            }
        }

        public void setBounds(Component c, Rectangle bounds) {
            this.bounds.put(c, bounds);
        }
    }

    protected void initUI() {
        JFrame frame = new JFrame("test");
        AbsoluteLayoutManager layout = new AbsoluteLayoutManager();
        JLayeredPane layeredPane = new JLayeredPane();
        layeredPane.setLayout(layout);
        final JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        panel.setBackground(Color.gray);
        panel.setVisible(true);
        layeredPane.add(panel);
        layout.setBounds(panel, new Rectangle(17, 59, 436, 480));
        frame.add(layeredPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestJLayeredPane().initUI();
            }
        });
    }
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.LayoutManager;
导入java.awt.Rectangle;
导入java.util.LinkedHashMap;
导入java.util.Map;
导入java.util.Map.Entry;
导入javax.swing.JFrame;
导入javax.swing.JLayeredPane;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类TestJLayeredPane{
公共静态类AbsoluteLayoutManager实现LayoutManager{
私有映射边界=新LinkedHashMap();
@凌驾
public void addLayoutComponent(字符串名称,组件组成){
put(comp,新矩形(comp.getPreferredSize());
}
@凌驾
公共void removeLayoutComponent(组件组件组件){
边界。移除(comp);
}
@凌驾
公共维度preferredLayoutSize(容器父级){
矩形rect=新矩形();
对于(矩形r:bounds.values()){
矩形=矩形并集(r);
}
返回rect.getSize();
}
@凌驾
公共维度minimumLayoutSize(容器父级){
返回preferredLayoutSize(父级);
}
@凌驾
公共无效布局容器(容器父级){
对于(条目e:bounds.entrySet()){
e、 getKey().setBounds(如getValue());
}
}
公共空心立根(构件c,矩形边界){
this.bounds.put(c,bounds);
}
}
受保护的void initUI(){
JFrame=新JFrame(“测试”);
AbsoluteLayoutManager布局=新建AbsoluteLayoutManager();
JLayeredPane layeredPane=新的JLayeredPane();
layeredPane.setLayout(布局);
最终JPanel面板=新JPanel();
panel.setLayout(新的FlowLayout(FlowLayout.LEFT,5,5));
面板.立根背景(颜色.灰色);
面板设置可见(真);
layeredPane.add(面板);
布局.立根(面板,新矩形(17,59,436,480));
frame.add(分层窗格);
frame.pack();
frame.setVisible(true);
}
publicstaticvoidmain(字符串[]args)抛出ClassNotFoundException、InstantiationException、IllegalAccessException、,
不受支持的LookandFeelException{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
新的TestJLayeredPane().initUI();
}
});
}
}

JLayeredPane
默认情况下使用空布局。因此,您应该实现自己的
LayoutManager
来设置
JLayeredPane
中每个组件的边界

请参见此示例:

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestJLayeredPane {

    public static class AbsoluteLayoutManager implements LayoutManager {

        private Map<Component, Rectangle> bounds = new LinkedHashMap<Component, Rectangle>();

        @Override
        public void addLayoutComponent(String name, Component comp) {
            bounds.put(comp, new Rectangle(comp.getPreferredSize()));
        }

        @Override
        public void removeLayoutComponent(Component comp) {
            bounds.remove(comp);
        }

        @Override
        public Dimension preferredLayoutSize(Container parent) {
            Rectangle rect = new Rectangle();
            for (Rectangle r : bounds.values()) {
                rect = rect.union(r);
            }
            return rect.getSize();
        }

        @Override
        public Dimension minimumLayoutSize(Container parent) {
            return preferredLayoutSize(parent);
        }

        @Override
        public void layoutContainer(Container parent) {
            for (Entry<Component, Rectangle> e : bounds.entrySet()) {
                e.getKey().setBounds(e.getValue());
            }
        }

        public void setBounds(Component c, Rectangle bounds) {
            this.bounds.put(c, bounds);
        }
    }

    protected void initUI() {
        JFrame frame = new JFrame("test");
        AbsoluteLayoutManager layout = new AbsoluteLayoutManager();
        JLayeredPane layeredPane = new JLayeredPane();
        layeredPane.setLayout(layout);
        final JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        panel.setBackground(Color.gray);
        panel.setVisible(true);
        layeredPane.add(panel);
        layout.setBounds(panel, new Rectangle(17, 59, 436, 480));
        frame.add(layeredPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestJLayeredPane().initUI();
            }
        });
    }
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.LayoutManager;
导入java.awt.Rectangle;
导入java.util.LinkedHashMap;
导入java.util.Map;
导入java.util.Map.Entry;
导入javax.swing.JFrame;
导入javax.swing.JLayeredPane;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类TestJLayeredPane{
公共静态类AbsoluteLayoutManager实现LayoutManager{
私有映射边界=新LinkedHashMap();
@凌驾
public void addLayoutComponent(字符串名称,组件组成){
put(comp,新矩形(comp.getPreferredSize());
}
@凌驾
公共void removeLayoutComponent(组件组件组件){
边界。移除(comp);
}
@凌驾
公共维度preferredLayoutSize(容器父级){
矩形rect=新矩形();
对于(矩形r:bounds.values()){
矩形=矩形并集(r);
}
返回rect.getSize();
}
@凌驾
公共维度minimumLayoutSize(容器父级){
返回preferredLayoutSize(父级);
}
@凌驾
公共无效布局容器(容器父级){
对于(条目e:bounds.entrySet()){
e、 getKey().setBounds(如getValue());
}
}
公共空心立根(构件c,矩形边界){
this.bounds.put(c,bounds);
}
}
受保护的void initUI(){
JFrame=新JFrame(“测试”);
AbsoluteLayoutManager布局=新建AbsoluteLayoutManager();
JLayeredPane layeredPane=新的JLayeredPane();
layeredPane.setLayout(布局);
最终JPanel面板=新JPanel();
panel.setLayout(新的FlowLayout(FlowLayout.LEFT,5,5));
面板.立根背景(颜色.灰色);
面板设置可见(真);
layeredPane.add(面板);
布局.立根(面板,新矩形(17,59,436,480));
frame.add(分层窗格);
frame.pack();
frame.setVisible(true);
}
publicstaticvoidmain(字符串[]args)抛出ClassNotFoundException、InstantiationException、IllegalAccessException、,
不受支持的LookandFeelException{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
s