Я работаю над созданием undecorated JFrame
, поэтому мне нужен способ изменить положение окна. Пока я могу сделать окно, следуя мыши, но я не могу остановить его. Я добавил ActionPerformed
к JButton
:Знайте, была ли нажата мышь без прослушивателя, или другой подход
test = true;
while (test) {
setLocation(MouseInfo.getPointerInfo().getLocation().x - 20, MouseInfo.getPointerInfo().getLocation().y - 20);
}
Смещения там держать указатель внутри JButton
, который графически выглядит нажатой в течение while
. Он творит чудеса, очень быстро. Но я не знаю, как остановить его. Я попытался добавить MouseClicked
, который устанавливает test
в false, но это не сработало. По-видимому, ни один прослушиватель не работает во время цикла.
Есть ли способ узнать, была ли нажата мышь внутри этого while
? Итак, без слушателя или события? Или есть другой подход к переустановке окна?
Edit:
Еще раз спасибо Jurgen Камильрайте, но я хотел бы добавить модифицированную версию своего примера, который я считаю, это проще, содержащей едва необходимые вещи, чтобы сделать эту работу.
package testbench;
import java.awt.EventQueue;
import java.awt.HeadlessException;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class DraggableFrame
extends JFrame
implements MouseListener, MouseMotionListener {
static Point dragged = null;
static Point pressed = null;
public DraggableFrame() throws HeadlessException {
addMouseListener(this);
addMouseMotionListener(this);
setBounds(0, 0, 320, 240);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setUndecorated(true);
}
public static void main (String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new DraggableFrame().setVisible(true);
}
});
}
@Override
public void mouseClicked (MouseEvent e) {}
@Override
public void mouseDragged (MouseEvent e) {
dragged = e.getLocationOnScreen();
setLocation(
(int)(dragged.getX() - pressed.getX()),
(int)(dragged.getY() - pressed.getY()));
}
@Override
public void mouseEntered (MouseEvent e) {}
@Override
public void mouseExited (MouseEvent e) {}
@Override
public void mouseMoved (MouseEvent e) {}
@Override
public void mousePressed (MouseEvent e) {
pressed = e.getPoint();
}
@Override
public void mouseReleased (MouseEvent e) {}
}
Не обращайте внимания на пустые переопределенные методы, они необходимы. В реальной программе, которую я разрабатывал, я использовал отдельный класс для слушателей, который работает так же хорошо. Кроме того, не имеет значения, реализуете ли вы Listener или расширяете адаптер. С одной стороны, вы можете реализовать оба интерфейса. С другой стороны, вам не нужно переопределять все методы расширенного абстрактного класса.
Также этот метод работает, если вы добавляете слушателей в контейнер вашего фрейма. Однако он будет вести себя так, как если бы этот контейнер находился в (0, 0). Вам нужно будет добавить некоторые смещения на setLocation()
.
Я хотел сказать: «Привет» перед текстом, но в первом и представить в двух правок, которые я сделал, что линия исчезла. У людей SO добавлен код для удаления «Привет? – GuiRitter
Основная проблема заключается в том, что ваш цикл внутри события Dispatching Thread, который предотвратит обработку любых новых событий (или перерисовки) – MadProgrammer
@MadProgrammer Я не уверен в том, что вы перекраины, потому что, как я уже сказал, моя первая попытка работал хорошо, так как в рамке перемещался с помощью мыши, но спасибо за информирование о событиях. – GuiRitter