JPanel不调用自定义LayoutManager的addLayoutComponent()

时间:2011-08-24 20:38:17

标签: java swing layout-manager

我需要创建一个由JPanel使用的自定义LayoutManager。

但是,当我向JPanel添加一个Component时,JPanel不会调用我的自定义LayoutManager的addLayoutComponent()方法,即使它应该: http://download.oracle.com/javase/tutorial/uiswing/layout/custom.html

(它按预期调用layoutContainer())

希望有人可以告诉我我做错了什么 如何让JPanel调用addLayoutComponent()?

import java.awt.*;
import javax.swing.*;

public class Test
{
    public static void main(String[] args)
    {
        createAndShowGUI();
    }



    private static void createAndShowGUI()
    {
        JButton button = new JButton("Test");
        button.setBounds(64, 64, 128, 64);

        JPanel panel = new JPanel(new CustomLayoutManager());

        //FIXME: Missing call to CustomLayoutManager.addLayoutComponent()
        panel.add(button); 

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(640, 480);
        frame.add(panel);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.toFront();
    }



    public static class CustomLayoutManager implements LayoutManager
    {
        public void addLayoutComponent(String name, Component comp)
        {
            System.out.println("addLayoutComponent");
        }

        public void layoutContainer(Container parent)
        {
            System.out.println("layoutContainer");
        }

        public Dimension minimumLayoutSize(Container parent)
        {
            System.out.println("minimumLayoutSize");
            return new Dimension();
        }

        public Dimension preferredLayoutSize(Container parent)
        {
            System.out.println("preferredLayoutSize");
            return new Dimension();
        }

        public void removeLayoutComponent(Component comp)
        {
            System.out.println("removeLayoutComponent");
        }
    }
}

1 个答案:

答案 0 :(得分:3)

  

如何让JPanel调用addLayoutComponent()?

如果布局管理器使用约束

,它只会调用此方法
panel.add(button);  

尝试:

panel.add("some constraint value", button);  

此方法旨在用于将约束传递给布局管理器。我认为BorderLayout是唯一可能使用它的布局管理器。但是通常不应该再使用它。相反,LayoutManager2使用:

public void addLayoutComponent(Component component, Object constraint)

允许您将任何Object作为约束传递。