Есть ли функция в java ограничить перемещение компонента только в кадре? - PullRequest
0 голосов
/ 19 мая 2019

Я попытался найти API, который ограничивает подвижную область компонента только внутри фрейма. Есть ли такой API?

Полагаю, такая функция находится в категории JFrame. но на самом деле есть почти вещи о создании компонентов Swing. Я также искал API SwingUtilities, но я думаю, что нет никакого полезного API, связанного с моей проблемой.

public void mouseDragged(MouseEvent arg0) {
    // TODO Auto-generated method stub
    Point MousePoint=arg0.getPoint();
    label.setBounds(0, 0, c.getWidth(), c.getHeight());
    label.setLocation(MousePoint);
}
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub
    label.setBounds(0, 0, c.getWidth(), c.getHeight());
    label.setLocation(getLocationOnScreen());
}

Я ожидал, что использование setBounds () ограничит подвижную область в Frame. но когда я перетаскивал метку над областью фрейма, он обнаружил, что метка движется вперед.

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Обычно вы добавляете ComponentListener к label и реализуете метод componentMoved.

В этом методе вы можете добавить проверки того, находится ли компонент в границах, и соответственно установить местоположение:

label.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentMoved(ComponentEvent e) {
        int newX = label.getX();
        int newY = label.getY();

        if(label.getX() < 0) {
            newX = 0;
        } else if(label.getX() + label.getWidth() > contentPane.getWidth()) {
            newX = contentPane.getWidth() - label.getWidth();
        }

        if(label.getY() < 0) {
            newY = 0;
        } else if(label.getY() + label.getHeight() > contentPane.getHeight()) {
            newY = contentPane.getHeight() - label.getHeight();
        }

        label.setLocation(newX, newY);
    }
});

Это решение отлично работает для меня!

0 голосов
/ 19 мая 2019

Вы можете добавить простые if проверки внутри ваших mouseDragged и mouseReleased методов, чтобы сохранить аргументы для вашего setBounds/setLocation вызова в заданном диапазоне.Вы можете использовать пример из Java - ограничение числа от минимального до максимального , чтобы сохранить числа от 0 до «ширина / высота панели / холста», например:

int ensureRange(int value, int min, int max) {
    return Math.min(Math.max(value, min), max);
}

Сначала необходимо рассчитать возможные минимальное и максимальное значения.После этого используйте эти новые значения для новых границ / местоположения.Код может выглядеть следующим образом (псевдокод):

public void mouseDragged(MouseEvent arg0) {
    Point mousePoint=arg0.getPoint();

    int x = ensureRange(mousePoint.x, 0, c.getWidth());
    int y = ensureRange(mousePoint.y, 0, c.getHeight());

    Point newPoint = new Point(x, y);

    label.setBounds(0, 0, c.getWidth(), c.getHeight());
    label.setLocation(newPoint);
}

Возможно, вам придется настроить ограничения на основе вашего кода.

...