2015-02-19 6 views
1

У меня есть ссылка на JPanel, который хранится внутри JFrame. Я попытался подключить ComponentAdaptor к JPanel, но когда я перемещаю JFrame, он не вызван. Любые идеи о том, как я могу обнаружить, когда JPanel перемещается на экран, если все, что у меня есть, является ссылкой на JPanel, а не на JFrame?Обнаружение при перемещении JPanel

Это мой адаптер:

private class Listener extends ComponentAdapter { 

    @Override 
    public void componentMoved(ComponentEvent e) { 
     if (e.getComponent().equals(target)) { 
      targetMoved(); 
     } else { 
      stickyMoved(); 
     } 
    } 
} 
+1

Я считаю, что вы хотите увидеть, перемещался ли JFrame, поскольку JPanel не перемещается, если он все еще находится в том же месте относительно его родительского контейнера. – NESPowerGlove

+0

Согласен, но, к сожалению, у меня есть ссылка на JPanel – user489041

ответ

3

Я думаю, AncestorListener - это то, что вы ищете.

JPanel не перемещается, но кадр, который его содержит. Вы можете использовать AncestorListener на панели, а не ComponentListener, чтобы получать уведомления о появлении таких событий на любых родительских компонентах.

private class Listener implements AncestorAdapter { 

    @Override 
    public void ancestorMoved(ComponentEvent e) { 
     if (e.getComponent().equals(target)) { 
      targetMoved(); 
     } else { 
      stickyMoved(); 
     } 
    } 
} 
+0

1+, один слушатель кажется проще, чем использование двух слушателей. – camickr

2

как я могу определить, когда JPanel перемещается на экране, если все у меня есть ссылка на JPanel и не JFrame?

Вы можете получить ссылку на JFrame с помощью:

SwingUtilities.windowForComponent(panel); 

Конечно, вы не будете знать, какой кадр до панели фактически была добавлена ​​к раме. Вы можете использовать AncestorListener, как показано в Dialog Focus, чтобы знать, когда панель действительно видна.

Тогда вы можете добавить свой ComponentListener к раме.

+0

Awesome, работал – user489041

+0

@ user489041, мне кажется, что подход Андрея будет проще, поскольку вам нужно всего лишь использовать один прослушиватель. В любом случае вы должны «принять» ответ, чтобы люди знали, что проблема решена. – camickr

+0

Спасибо! Я был смущен, почему вы не просто реализуете предков, потому что уже упоминали о добавлении AncestorListener и боялись, что я что-то пропустил и боялся, что я что-то пропустил. :) –

Смежные вопросы