изменение текста jLabel в перетаскиваемой панели jPanel

В моей программе есть jPanel с jLabel внутри. Я добавил этот код, чтобы сделать jPanel перетаскиваемым, и он отлично работает.

private void formMousePressed(java.awt.event.MouseEvent evt) {                                  
    prevX = evt.getXOnScreen();
}                                 

private void formMouseDragged(java.awt.event.MouseEvent evt) {                                  
    this.setLocation(this.getX() + evt.getXOnScreen() - prevX, this.getY());
    prevX = evt.getXOnScreen();
    // this.labBirthDate.setText(Integer.toString(this.getX()));
}

Однако, когда я добавил закомментированный код, который обновляет метку, чтобы показать положение панели, он перестал работать. В частности, когда я щелкаю и перетаскиваю панель, вместо того, чтобы следовать за мышью, панель просто заикается, а текст изменяется на значение ~ 10, меняясь при каждом перемещении мыши.

Делая вещи еще более запутанными, если я вместо этого изменю его так, чтобы он просто установил текст на «бла», это не приведет к ошибке. Кроме того, если я просто установлю переменную равной this.getX(), это не приведет к ошибке. Если я затем установлю метку как значение этой локальной переменной, ошибка вернется.

Кто-нибудь знает, почему это может происходить? Есть ли обходной путь, который я могу использовать для получения того же эффекта?


person AgentPaper    schedule 19.07.2013    source источник


Ответы (1)


Когда вы вызываете метод setText() для метки, для метки вызываются методы revalidate() и repaint(). Это приведет к вызову менеджера компоновки, и я предполагаю, что менеджер компоновки сбросит панель в положение по умолчанию.

Если вы хотите иметь возможность случайным образом перемещать компоненты по экрану, вам нужно использовать нулевой макет на родительском элементе перетаскиваемой панели. Как только вы это сделаете, вам также нужно будет вручную установить размер и расположение ваших компонентов.

В этом случае вам может пригодиться макет перетаскивания.

person camickr    schedule 19.07.2013