java - jPanel 未显示在 jLayeredPane 内

标签 java swing dynamic jpanel jlayeredpane

我已阅读有关此问题的所有主题,但我无法弄清楚问题出在哪里。

以下代码位于单击按钮时调用的方法内,按钮是动态生成的,是的,控制台输出正在显示,因此该方法正在被调用。

    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 - jPanel 未显示在 jLayeredPane 内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28918657/

相关文章:

java - 如何在 genymotion 上运行客户端服务器?

java - 如何在 portlet 中使用 Liferay 内部代码?

java - 除非选择单元格,否则 JTable 数据是不可见的

java - 在 Swing 中移动背景图像

java - 如何获取 MOXy oxml 映射文件以识别静态类

java - 如何在应用 RowFilter 过滤后禁用 jtable 中的列标题排序

java - 在java swing中动态添加复选框

即使没有传递指针,线程中的所有函数都可以访问动态分配的内存(堆)吗?或者它是函数的本地函数吗?

javascript - 并行 promise 链,其间具有顺序动态内容

java - Java 中的 Linux PAM 模块