как создать JDialog, который может перемещаться только в пределах его родительского фрейма

#java

#java

Вопрос:

Я хочу создать JDialog , который может перемещаться только в пределах его родительского фрейма. То есть его нельзя вытащить из родительского фрейма. Есть идеи? прослушиватель движения мыши?

Спасибо,

Редактировать:

  1. Мое приложение основано на фрейме, а не на внутреннем фрейме, поэтому я не могу использовать JInternalFrame
  2. Мне нужен немодальный диалог, поэтому я не могу использовать JOptionPane с внутренней функцией.

Ответ №1:

Используйте JInternalFrame вместо этого. Смотрите эту страницу для примера.

Комментарии:

1. Да, но InternalFrame может быть полностью скрыт на краю его родительского фрейма. Есть ли способ избежать этого? Я не хочу, чтобы внутренний фрейм или плавающий диалог были частично или полностью скрыты его родительским фреймом. это означает, что левая боковая граница внутреннего фрейма или диалогового окна не может выходить за левую боковую границу его родительского фрейма.

2. @5YrsLaterDBA: Смотрите методы, включающие строку ‘internal’ в JOptionPane .

3. Пожалуйста, посмотрите правку выше. Я не могу использовать JOptionPane, потому что мне нужен немодальный диалог для отображения некоторых полученных данных.

Ответ №2:

Хорошо, вы должны были указать «скрытую» проблему в первоначальном вопросе.

Я нашел очень сложное решение, я не предлагаю использовать его, за исключением разработки лучшего, возможно, начиная с этого. Учитывая JInternalFrame, предоставьте ему прослушиватель componentMove, чтобы запретить перемещение его в скрытые позиции. Насколько я его тестировал, у него есть проблемы с обновлением (возможно, их можно решить) и стабильность в крайнем случае, которую тоже нужно оценить. Предоставляется «как есть» для дальнейшего улучшения, а не как хорошая часть программного обеспечения 🙂

 public void componentMoved(ComponentEvent e) {

                Rectangle r = new Rectangle();

                MyInternalFrame mif = MyInternalFrame.this;
                JDesktopPane dp = mif.getDesktopPane();

                if (mif.getX()   mif.getWidth()> dp.getWidth()) {
                    mif.setLocation(mif.getDesktopPane().getWidth()-mif.getWidth(),mif.getY());
                }

                if (mif.getY()   mif.getHeight()> dp.getHeight()) {
                    mif.setLocation(mif.getX(), mif.getDesktopPane().getHeight()-mif.getHeight());
                }

                if (mif.getX()<0) {
                    mif.setLocation(0, mif.getY());
                }

                if (mif.getY()<0) {
                    mif.setLocation(mif.getX(), 0);
                }

            }

        });