Как точно настроить возможность выбора в Piccolo2D?

В приведенном ниже коде два круга нарисованы и добавлены к одному узлу группировки.

Наблюдаются следующие варианты поведения:

1) Возможность перетаскивания на любую точку круга, включая экстерьер и интерьер; если перетаскивание по точке пересечения, перетаскивание не происходит

2) Способен перетаскивать только снаружи

3) Невозможно перетащить

4) Возможность перетаскивания на любую точку в расширенных границах

Любое поведение инициируется subinitialize() Титулы.

Интересно, возможно ли точно настроить активные "точки взлома" узла? Например, можно ли оставить подузлы недоступными для выбора, но сделать всю группу перетаскиваемой только внешними кругами, как это было в случае (2)?

Необходимость необходима, потому что Piccolo не позволяет определить, в какой группе объектов был сделан клик. В частности, я не могу определить групповой узел, к которому был подключен прослушиватель, поэтому, если у меня будет один прослушиватель и я подключу его к нескольким узлам, я не смогу определить, какой из них был вызван.

public class Try_Picking_01 {

    private static final Logger log = LoggerFactory.getLogger(Try_Picking_01.class);

    public static void main(String[] args) {
        new PFrame() {

            final PNode group = new PNode();

            @Override
            public void initialize() {



                group.addInputEventListener(new PBasicInputEventHandler() {
                    @Override
                    public void mouseDragged(PInputEvent event) {

                        PDimension dim = event.getDeltaRelativeTo(group.getParent());
                        group.offset(dim.getWidth(), dim.getHeight());

                    }
                });

                getCanvas().getLayer().addChild(group);
                getCanvas().setPanEventHandler(null);

                // able to drag by any point of circle, including exterior and interior
                // if drag by intercircle point, drag does not occur
                // subinitialize(false, true, false);

                // able to drag only by exterior
                //subinitialize(true, true, false);

                // unable to drag
                // subinitialize(true, false, false);

                // able to drag by any point in extended bounds
                subinitialize(true, false, true);



            }

            private void subinitialize(boolean emptyFill, boolean pickable, boolean expandBounds) {

                PPath path1 = PPath.createEllipse(100, 100, 100, 100);
                path1.setStrokePaint(Color.RED);
                path1.setPaint( emptyFill ? null : Color.YELLOW ); // line #1
                log.info("path1.bounds = {}", path1.getBounds());
                path1.setPickable(pickable); // line #2

                PPath path2 = PPath.createEllipse(200, 200, 100, 100);
                path2.setPaint( emptyFill ? null : Color.YELLOW ); // line #3
                log.info("path2.bounds = {}", path2.getBounds());
                path2.setPickable(pickable); // line #4

                group.addChild(path1);
                group.addChild(path2);
                log.info("group.bounds = {}", group.getBounds());

                if( expandBounds ) {
                    group.setBounds(group.getFullBounds()); // line #5
                    log.info("group.bounds = {}", group.getBounds());
                }

            }
        };
    }
}

1 ответ

Suzan,

Глядя на то, как Piccolo управляет входными событиями, наиболее разумным было бы создать определенный обработчик событий для каждой из ваших групп узлов. Piccolo предоставляет вам только общий обработчик ввода на уровне PNode. Это делает все события PNode эффективно одинаковыми. Если вы хотите определить другое поведение для узла (или группы), вам нужно извлечь класс (например, из PNode или PPath) и добавить логику, чтобы определить, какая группа узлов была нажата, и перетащить в соответствии с настройками, переданными в subInitialize.

Самое замечательное в Java - то, что вы можете легко расширять библиотеки, такие как Piccolo, в соответствии со своими собственными целями.

Другие вопросы по тегам