JPanel не вызывает addLayoutComponent () пользовательского LayoutManager - PullRequest
2 голосов
/ 25 августа 2011

Мне нужно создать пользовательский LayoutManager для использования с JPanel.

Однако, когда я добавляю Компонент в JPanel, JPanel не вызывает метод addLayoutComponent () моего пользовательского LayoutManager, даже если он должен:
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 Ответ

3 голосов
/ 25 августа 2011

Как заставить JPanel вызывать addLayoutComponent ()?

Этот метод будет вызываться только в том случае, если ваш менеджер макета использует ограничения

panel.add(button);  

Попробуйте:

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

Этот метод предназначен для передачи ограничений диспетчеру компоновки. Я думаю, что BorderLayout - единственный менеджер макета, который мог бы использовать это. Однако, как правило, его больше не следует использовать. Вместо этого LayoutManager2 использует:

public void addLayoutComponent(Component component, Object constraint)

, который позволяет передавать любой объект в качестве ограничения.

...