2
我需要創建一個由JPanel使用的自定義LayoutManager。JPanel不會調用自定義LayoutManager的addLayoutComponent()
然而,當我將組件添加到JPanel中,JPanel的不叫我的自定義佈局管理的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");
}
}
}
非常感謝這個簡潔的答案。 看起來唯一「穩定」的方法是實現LayoutManager2。使用Container.add(Component component,Object constraint),根據需要調用LayoutManager2.addLayoutComponent(Component component,Object constraint)方法。 – Meyer
問題是否有約束和putProperty之間的一些不同之處(我用於DocumentListener),當然也許我的問題是不符合實際的(缺少關於...的知識)+1 – mKorbel
@mKorbel,約束是使用的對象由佈局經理幫助控制組件的佈局。有關如何使用約束的示例,請參閱GridBagLayout和GridBagConstraints。我不確定在DocumentListener或LayoutManager中使用了putProperty(),所以我不確定你在問什麼。 – camickr