我需要创建一个由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");
}
}
}
答案 0 :(得分:3)
如何让JPanel调用addLayoutComponent()?
如果布局管理器使用约束
,它只会调用此方法panel.add(button);
尝试:
panel.add("some constraint value", button);
此方法旨在用于将约束传递给布局管理器。我认为BorderLayout是唯一可能使用它的布局管理器。但是通常不应该再使用它。相反,LayoutManager2使用:
public void addLayoutComponent(Component component, Object constraint)
允许您将任何Object作为约束传递。