Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/91: Рейтинг темы: голосов - 91, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 121

Движение фигуры

31.07.2013, 13:46. Показов 16649. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Решил попрактиковать JPanel и GUI, и в задаче необходимо перемещать фигуру по оси Х и У движением мыши. Скрипт работает и перемещает , но только в тот момент когда окно только только появляется, а нужно что-бы фигура двигалась в течение всего времени работы программы.
Вот код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package mouse;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
 
public class Frames extends JFrame{
    public Frames(String str){
        super(str);
        Container c = getContentPane();
        Panel p = new Panel();
        c.add(p);
                
        setSize(500,500);
        setVisible(true);
        }
 
}
 
class Panel extends JPanel{
    int x,y;
    public Panel(){
    addMouseMotionListener(new MouseMotionAdapter(){
            public void mouseMoved(MouseEvent e) {
                    x = e.getX();
                    y = e.getY();
    }
    });
    }
    
    public void paintComponent(Graphics g){
        g.setColor(Color.red);
        g.fillOval(x,y,66,66);
        
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2013, 13:46
Ответы с готовыми решениями:

Движение фигуры в Java
Суть проблемы такова, после запуска программы рисуется новый квадрат с новыми координатами, при этом старый остаётся на рисунке. Как...

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

Мелькание фигуры при движение
Можно ли как избавиться от мигания фигуры во время движения по экрану? Есть окно апплета, на котором нарисован с помощью fillRect квадрат и...

11
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
31.07.2013, 14:03
Так вы ему не говорите перерисовывать - он и не перерисовывает. То, что вы поменяли координаты не означает, что картинка на экране изменилась. Нужно отдельное действие для этого.
0
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 121
31.07.2013, 14:09  [ТС]
Какое действие и как его реализовать?
0
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
31.07.2013, 14:11
repaint();
после координат в методе mouseMoved

Java
1
2
3
        //Container c = getContentPane();
        Panel p = new Panel();
        add(p);
и вот так тоже нормально работает
0
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 121
31.07.2013, 14:12  [ТС]
Делал. Оно перерисовывает область своих координат. А нужно просто перемещать фигуру
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
31.07.2013, 14:17
Что вы понимаете под "двигать фигуру"? У вас есть область памяти, в которой находится объект Panel, у вас есть набор пикселей на экране. У вас есть 2D-движок, который по определенном алгоритму преобразует содержимое области памяти в параметры пикселей. После того, как у вас изменилось содержимое памяти вам нужно дать команду изменить параметры пикселей чтобы они соответствовали новым значениям. Где тут "движение"?

Мне представляется, что после добавления repaint() прямоугольник "прицепится" у курсору и будет ползать за ним. Разве не так?
0
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 121
31.07.2013, 14:22  [ТС]
Я откуда знаю?
0
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
31.07.2013, 15:06
мне не нравится мой код, но работает, кто захочет - принцип поймет
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Frames extends JFrame {
    int x = 0, y = 0;
    JPanel p;
 
    public Frames(String str) {
        super(str);
        p = new JPanel();
        p.setLayout(null);
        Circle c = new Circle();
        p.add(c);
        add(p);
        setSize(500, 500);
        setVisible(true);
 
        addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                x = e.getX();
                y = e.getY();
                p.setLocation(x, y);
 
            }
        });
 
    }
 
    public static void main(String[] args) {
        Frames f = new Frames("123");
    }
}
 
class Circle extends JPanel {
 
    public Circle() {
        setBounds(0, 0, 66, 66);
    }
 
    public void paintComponent(Graphics g) {
        g.setColor(Color.red);
        g.fillOval(0, 0, 66, 66);
 
    }
}
1
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 121
31.07.2013, 15:27  [ТС]
ааа, я понял. переменные х и у при движении меняются, а их изменения вступают в силу через p.setLocation(x, y); так?
только не пойму зачем конструктор Circle
0
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
31.07.2013, 15:32
забыл убрать
фишка там в том, что нарисованная фигура рисуется один раз внутри JPanel и координаты меняем у панели, а не у самого кружка
надо выше там добавить c.setBounds(0, 0, 66, 66); иначе видно ничего не будет
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
01.08.2013, 00:27
Вот такой пример для передвижения фигур у меня завалялся:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
 
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
 
@SuppressWarnings("serial")
public class ShapesDragging extends JComponent {
 
    private static class Item {
        public Shape shape;
        public Color color;
        public AffineTransform transform;
    }
 
    private java.util.List<Item> items;
    private double dx;
    private double dy;
    private double scale;
 
    public ShapesDragging() {
        items = new ArrayList<Item>();
        dx = 0.0;
        dy = 0.0;
        scale = 1.0;
        DragShape dragShape = new DragShape();
        PanZoom panZoom = new PanZoom();
        addMouseListener(dragShape);
        addMouseListener(panZoom);
        addMouseMotionListener(dragShape);
        addMouseMotionListener(panZoom);
        addMouseWheelListener(panZoom);
    }
 
    public void addItem(Shape shape, Color color) {
        AffineTransform transform = AffineTransform.getTranslateInstance(0, 0);
        addItem(shape, color, transform);
    }
 
    public void addItem(Shape shape, Color color, AffineTransform transform) {
        Item item = new Item();
        item.shape = shape;
        item.color = color;
        item.transform = transform;
        items.add(item);
    }
 
    public void translate(double tx, double ty) {
        dx += tx * scale;
        dy += ty * scale;
    }
 
    public void scale(double factor, double x, double y) {
        double coef = scale * (1.0 - factor);
        dx += coef * x;
        dy += coef * y;
        scale *= factor;
    }
 
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(0, 0, getWidth(), getHeight());
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.translate(dx, dy);
        g2d.scale(scale, scale);
        for (Item item : items) {
            AffineTransform saved = g2d.getTransform();
            g2d.transform(item.transform);
            g2d.setColor(item.color);
            g2d.fill(item.shape);
            g2d.setTransform(saved);
        }
    }
 
    private Point2D mapToScene(Point point) {
        double x = (point.x - dx) / scale;
        double y = (point.y - dy) / scale;
        return new Point2D.Double(x, y);
    }
 
    private Item findItem(Point2D point) {
        // process items in the order reversed to drawing order
        ListIterator<Item> iter = items.listIterator(items.size());
        while (iter.hasPrevious()) {
            Item item = iter.previous();
            AffineTransform transform = item.transform;
            Shape shape = item.shape;
            Point2D transfPoint = null;
            try {
                if (shape.contains(transform.inverseTransform(point, transfPoint)))
                    return item;
            } catch (NoninvertibleTransformException ignored) {
            }
        }
        return null;
    }
 
    private class DragShape extends MouseAdapter {
        private Item hoverItem;
        private boolean isDragging;
        private Point previous;
        private Cursor savedCursor;
 
        @Override
        public void mouseDragged(MouseEvent e) {
            if (!isDragging)
                return;
            // don't move item if both mouse buttons are pressed
            if ((e.getModifiersEx() & MouseEvent.BUTTON3_DOWN_MASK) == 0) {
                Point2D point = mapToScene(e.getPoint());
                Point2D prevPoint = mapToScene(previous);
                double tx = point.getX() - prevPoint.getX();
                double ty = point.getY() - prevPoint.getY();
                AffineTransform transform = AffineTransform.getTranslateInstance(tx, ty);
                transform.concatenate(hoverItem.transform);
                hoverItem.transform = transform;
                repaint();
            }
            previous = new Point(e.getPoint());
        }
 
        @Override
        public void mouseMoved(MouseEvent e) {
            Point2D point = mapToScene(e.getPoint());
            Item item = findItem(point);
            if (hoverItem == null && item != null) {
                savedCursor = getCursor();
                setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
            } else if (hoverItem != null && item == null) {
                setCursor(savedCursor);
            }
            hoverItem = item;
        }
 
        @Override
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON1 && !isDragging && hoverItem != null) {
                isDragging = true;
                previous = new Point(e.getPoint());
            }
        }
 
        @Override
        public void mouseReleased(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON1 && isDragging) {
                isDragging = false;
            }
        }
    }
 
    private class PanZoom extends MouseAdapter {
        private boolean isDragging;
        private Point previous;
        private Cursor savedCursor;
 
        @Override
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON3 && !isDragging) {
                isDragging = true;
                previous = new Point(e.getPoint());
                savedCursor = getCursor();
                setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
            }
        }
 
        @Override
        public void mouseReleased(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON3 && isDragging) {
                isDragging = false;
                setCursor(savedCursor);
            }
        }
 
        @Override
        public void mouseDragged(MouseEvent e) {
            if (isDragging) {
                Point2D point = mapToScene(e.getPoint());
                Point2D prevPoint = mapToScene(previous);
                double tx = point.getX() - prevPoint.getX();
                double ty = point.getY() - prevPoint.getY();
                translate(tx, ty);
                previous = new Point(e.getPoint());
                repaint();
            }
        }
 
        @Override
        public void mouseWheelMoved(MouseWheelEvent e) {
            double factor = Math.pow(1.2, e.getWheelRotation());
            Point2D point = mapToScene(e.getPoint());
            scale(factor, point.getX(), point.getY());
            repaint();
        }
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Shapes Dragging");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                ShapesDragging shapesDragging = new ShapesDragging();
                shapesDragging.addItem(new Rectangle2D.Double(30, 30, 150, 100), Color.RED);
                shapesDragging.addItem(new Ellipse2D.Double(200, 150, 200, 100), Color.BLUE,
                        AffineTransform.getRotateInstance(0.7, 300, 200));
                Path2D.Double path = new Path2D.Double();
                path.moveTo(400, 10);
                path.lineTo(450, 150);
                path.lineTo(350, 150);
                path.closePath();
                shapesDragging.addItem(path, Color.GREEN);
                path = new Path2D.Double();
                path.moveTo(30, 220);
                path.lineTo(150, 220);
                path.append(new Arc2D.Double(120, 220, 100, 100, 90, -180, Arc2D.OPEN), true);
                path.lineTo(30, 320);
                path.closePath();
                Stroke stroke = new BasicStroke(20.0f);
                shapesDragging.addItem(stroke.createStrokedShape(path), Color.MAGENTA);
                path = new Path2D.Double();
                path.moveTo(500, 200);
                path.curveTo(600, 300, 550, 400, 450, 250);
                path.closePath();
                shapesDragging.addItem(stroke.createStrokedShape(path), Color.YELLOW);
                frame.getContentPane().add(shapesDragging);
                frame.setSize(600, 400);
                frame.setVisible(true);
            }
        });
    }
}
1
0 / 0 / 1
Регистрация: 23.07.2015
Сообщений: 6
23.07.2015, 16:15
Вот стандартный пример от Oracle (немного поменял размеры окна)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package sample; /**
 * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
 * All rights reserved. Use is subject to license terms.
 */
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.animation.Timeline;
import javafx.animation.TranslateTransition;
import javafx.animation.TranslateTransitionBuilder;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.util.Duration;
 
/**
 * A sample in which a node moves from one location to another over a given
 * time.
 *
 * @related animation/transitions/FadeTransition
 * @related animation/transitions/FillTransition
 * @related animation/transitions/ParallelTransition
 * @related animation/transitions/PathTransition
 * @related animation/transitions/PauseTransition
 * @related animation/transitions/RotateTransition
 * @related animation/transitions/ScaleTransition
 * @related animation/transitions/SequentialTransition
 * @related animation/transitions/StrokeTransition
 * @see javafx.animation.TranslateTransition
 * @see javafx.animation.TranslateTransitionBuilder
 * @see javafx.animation.Transition
 */
public class TranslateTransitionSample extends Application {
 
    private TranslateTransition translateTransition;
 
    private void init(Stage primaryStage) {
        Group root = new Group();
        primaryStage.setResizable(false);
        primaryStage.setScene(new Scene(root, 450,100));
        Circle circle = new Circle(20, Color.CRIMSON);
        circle.setTranslateX(20);
        circle.setTranslateY(50);
        root.getChildren().add(circle);
        translateTransition = new TranslateTransition(Duration.seconds(4),circle);
        translateTransition.setFromX(50);
        translateTransition.setToX(380);
        translateTransition.setCycleCount(Timeline.INDEFINITE);
        translateTransition.setAutoReverse(true);
        translateTransition = TranslateTransitionBuilder.create()
                .duration(Duration.seconds(4))
                .node(circle)
                .fromX(50)
                .toX(380)
                .cycleCount(Timeline.INDEFINITE)
                .autoReverse(true)
                .build();
    }
 
    public void play() {
        translateTransition.play();
    }
 
    @Override public void stop() {
        translateTransition.stop();
    }
 
    public double getSampleWidth() { return 400; }
 
    public double getSampleHeight() { return 100; }
 
    @Override public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
        play();
    }
    public static void main(String[] args) { launch(args); }
}
Добавлено через 43 минуты
Извиняюсь. С регистрацией не в тот пост написал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.07.2015, 16:15
Помогаю со студенческими работами здесь

Движение фигуры
Нужно организовать движение прорисованной фигуры. Движение связано с нажатие на клавишу Еnter. Т.е. нажали на Enter, и фигурка...

Движение фигуры
Здравствуйте ! Я создал фигуру которая он начала координат двигается вперед,пытался чтобы ещё он возвращался обратно,но он как только...

Движение фигуры
Дана фигура. Для того чтобы она двигалась рассчитал dx и dy, причём оба в промежутке от -5 до 5. Далее условие таково, что фигур должна при...

Движение фигуры
Подскажите, пожалуйста. Сколько ни искал информации, не могу настроить движение. procedure KeyPress(key: integer); begin ...

Движение фигуры
Ребят помогите выполнить задание то не что-то не получается


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru