Java Swing перемещает JFrame с помощью мыши - PullRequest
1 голос
/ 17 марта 2019

Я играю с графикой Java Swing и т. Д. Я пытаюсь создать форму регистрации / входа.

enter image description here

Я установил Undecorated (true) и создал свой собственный верхний бар. Когда вы тащите эту панель, я хочу, чтобы весь кадр двигался. И я также хочу, чтобы мышь оставалась в том же положении на кадре.

С этим кодом:

Рамка движется. Но мышь перемещается в верхний правый угол, кадры начальных координат X и Y.

    JFrame frame = (JFrame) SwingUtilities.windowForComponent(this);

    int mouseX = MouseInfo.getPointerInfo().getLocation().x; // Mouse X Coordinate
    int mouseY = MouseInfo.getPointerInfo().getLocation().y; // Mouse Y Coordinate
    int diffX = mouseX - frame.getX(); // The distance from JFrame X Coordinate to Mouse X Coordinate. 
    int diffY = mouseY - frame.getY(); // The distance from JFrame Y Coordinate to Mouse Y Coordinate.



    if (diffY < 45) { // Y Coordinate 0 - 45 is the height of the top part of the window. Where you can move the frame.
        frame.setLocation(mouseX, mouseY);
    }

enter image description here

Насколько мне известно, приведенный ниже код должен заставить мышь оставаться на своем месте перед перетаскиванием.

    JFrame frame = (JFrame) SwingUtilities.windowForComponent(this);

    int mouseX = MouseInfo.getPointerInfo().getLocation().x; // Mouse X Coordinate
    int mouseY = MouseInfo.getPointerInfo().getLocation().y; // Mouse Y Coordinate
    int diffX = mouseX - frame.getX(); // The distance from JFrame X Coordinate to Mouse X Coordinate. 
    int diffY = mouseY - frame.getY(); // The distance from JFrame Y Coordinate to Mouse Y Coordinate.



    if (diffY > 0 && diffY < 45) { // Y Coordinate 0 - 45 is the height of the top part of the window. Where you can move the frame.
        int x = mouseX - diffX;
        int y = mouseY - diffY;

        frame.setLocation(x, y);
    }

Но вместо этого .. ничего не происходит. Функция вызывается, но кадр не движется. Что я делаю неправильно? Я не могу найти проблему.

EDIT * Я создал класс ComponentMover и создал его экземпляр следующим образом:

    DragListener drag = new DragListener();
    JFrame frame = (JFrame) SwingUtilities.windowForComponent(this);

    int mouseX = MouseInfo.getPointerInfo().getLocation().x; // Mouse X Coordinate
    int mouseY = MouseInfo.getPointerInfo().getLocation().y; // Mouse Y Coordinate
    int diffX = mouseX - frame.getX(); // The distance from JFrame X Coordinate to Mouse X Coordinate. 
    int diffY = mouseY - frame.getY(); // The distance from JFrame Y Coordinate to Mouse Y Coordinate.



    if (diffY > 0 && diffY < 45) { // Y Coordinate 0 - 45 is the height of the top part of the window. Where you can move the frame.
        frame.addMouseListener( drag );
        frame.addMouseMotionListener( drag );
    }

    ComponentMover cm = new ComponentMover(this, frame);

Но проблема сохраняется.

Заранее спасибо за помощь!

РЕДАКТИРОВАТЬ 2 * Это подход, который я выбрал, чтобы заставить работать ComponentMover. Хотя я не уверен, что он может делать то, что я хочу.

ЭТО КОДЕКС

public class CompMoverTest extends JFrame{

    public CompMoverTest(){
        MainPanel mp = new MainPanel();

        setLayout(new FlowLayout());
        setUndecorated(true);
        add(mp);
        setSize(500,500);
        setVisible(true);
        setLocationRelativeTo(null);
    }


    public static void main(String[] args) {
        new CompMoverTest();
    }

}

class MainPanel extends JPanel{

    public MainPanel(){
        JFrame frame = (JFrame) SwingUtilities.windowForComponent(this);
        setPreferredSize(new Dimension(300,300));
        setBackground(Color.yellow);

        ComponentMover cm = new ComponentMover(frame, this);
    }
}

ЭТО РЕЗУЛЬТАТ

enter image description here

ЭТО ЧТО Я ХОЧУ

enter image description here

Надеюсь, это достаточно ясно. Теперь у меня есть желтая панель, которая перемещается, когда я ее перетаскиваю. Я понимаю, что это функция класса ComponentMover.

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

1 Ответ

0 голосов
/ 18 марта 2019
JFrame frame = (JFrame) SwingUtilities.windowForComponent(this);

Панель еще не была добавлена ​​к фрейму, поэтому вы не можете использовать вышеуказанный метод в конструкторе для доступа к родительскому фрейму.

Если вы действительно хотите добавить ComponentMoverв пользовательском классе панели вы можете переопределить метод addNotify ():

@Override
public void addNotify()
{
    super.addNotify();

    JFrame frame = (JFrame) SwingUtilities.windowForComponent(this);
    ComponentMover cm = new ComponentMover(frame, this);
}
...