Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для AlexProgramm
227 / 97 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47

Движение круга по нажатию кнопки

22.01.2023, 22:05. Показов 1240. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, тренируюсь тут с 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
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
package test.grmoveoval;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
/**
 *
 * @author telal
 */
public class GrMoveOval implements ActionListener {
 
    JFrame frame = new JFrame();
    JButton but = new JButton("Click me");
    MyPanel mpl = new MyPanel();
    int x = 10, y = 10;
    
    public static void main(String[] args) {
        GrMoveOval gm = new GrMoveOval();
        gm.go();
    }
    
    public void go() {
 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1000, 800);
        frame.setVisible(true);
        //MyPanel mp = new MyPanel();
        
        frame.getContentPane().add(BorderLayout.SOUTH,but);
        frame.getContentPane().add(BorderLayout.CENTER,mpl);
        
        but.addActionListener(this);
        
        int i;
        for (i = 0; i < 130; i++) {
            x++;
            y++;
            
            mpl.repaint();
            
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
                Logger.getLogger(GrMoveOval.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        
    }
    
    public class MyPanel extends JPanel {
        
        public void paintComponent(Graphics g) {
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        int red = (int) (Math.random() * 255);
        int green = (int) (Math.random() * 255);
        int blue = (int) (Math.random() * 255);
        Color randomColor = new Color(red, green, blue);
        g.setColor(randomColor);
        g.fillOval(x, y, 100, 100);
        }
    }    
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2023, 22:05
Ответы с готовыми решениями:

Смена цвета круга по нажатию кнопки
import java.awt.event.*; import java.awt.*; import javax.swing.*; public class Gitis implements ActionListener{ JFrame...

Движение круга по нажатию клавиши
Здравствуйте, мне надо сделать движение шарика при нажатии стрелочки(движение соответствует напрвавлению нажатой клавиши), если справа нету...

Не получается реализовать движение слайдов влево по нажатию кнопки.
Доброго времени суток, коллеги. Есть слайдер: &lt;div class=&quot;container&quot;&gt; &lt;div id=&quot;slider&quot;&gt; &lt;div...

12
 Аватар для IbnMong
135 / 62 / 13
Регистрация: 10.03.2022
Сообщений: 215
22.01.2023, 22:18
Java
1
2
3
 public void actionPerformed(ActionEvent e) {
          //Код, который нужно выполнить при нажатии
     }
для обработки события нажатия кнопки JButton можно создать анонимный класс, который реализует интерфейс ActionListener. Пример:

Java
1
2
3
4
5
button.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
          textField.setText(e.getActionCommand()); // здесь заменяете установку текста в текстовом поле на ваши дийствия
     }
});
0
 Аватар для AlexProgramm
227 / 97 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
22.01.2023, 23:17  [ТС]
В том то и дело, помещаю код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
int i;
        for (i = 0; i < 130; i++) {
            x++;
            y++;
            
            mpl.repaint();
            
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
                Logger.getLogger(GrMoveOval.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
в метод actionPerformed, и круг не двигается, а колбасится несколько секунд на одном месте, а потом перепрыгивает в конечную точку
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
23.01.2023, 19:18
AlexProgramm, движение по кругу через тригнометрические формулы можешь сделать, где y - sin, x - cos. Радиус будет мультипликатором, т.к. они единичную окружность образуют.
Прим:
Java
1
2
3
4
int radius = 5;
for (i = 0; i < 360; i++) {
    x = Math.cos(Math.toRadians(i)) * radius;
    y = Math.sin(Math.toRadians(i)) * radius;
Добавлено через 1 час 48 минут
Цитата Сообщение от AlexProgramm Посмотреть сообщение
круг начал двигаться по нажатию кнопки
Хотя, если вопрос в этом, то при repaint происходит синхронизация потоков, поэтому прежде чем перерисовать ожидается полное завершение. Наверное, стоти сделать как-то так:
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
import javax.swing.*;
import java.awt.*;
 
public class Main {
    Timer timer;
    int q;
    JFrame win1;
    Circle circle;
    JButton but;
 
    public Main() {
        circle = Factory.getCircle();
        but = Factory.getButton();
        but.addActionListener(e -> {
            q = 0;
            timer.start();
        });
        timer = new Timer(50, e -> actionTimer());
        win1 = Factory.getFrame();
        win1.getContentPane().add(circle);
        win1.getContentPane().add(but);
    }
 
    public static void main(String[] args) {
        Main main = new Main();
        main.win1.setVisible(true);
    }
 
    public void timerStop() {
        timer.stop();
    }
 
    public void actionTimer() {
        circle.setLocation(circle.getX() + 1, circle.getY() + 1);
        circle.setBackground(Tools.randomColor());
        if (++q >= 130) {
            timerStop();
        }
    }
 
 
}
 
class Factory {
    public static JFrame getFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1000, 800);
        frame.setVisible(false);
        frame.setLayout(null);
        return frame;
    }
 
    public static JButton getButton() {
        JButton button = new JButton("Click me");
        button.setSize(200, 100);
        button.setVisible(true);
        return button;
    }
 
    public static Circle getCircle() {
        Circle circle = new Circle();
        circle.setBackground(Tools.randomColor());
        circle.setBounds(200, 200, 100, 100);
        circle.setVisible(true);
        circle.setOpaque(false);
        return circle;
    }
 
    public static Graphics2D factoryGraphics2D(Graphics g) {
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
        return g2d;
    }
}
 
class Tools {
    public static Color randomColor() {
        int red = (int) (Math.random() * 255);
        int green = (int) (Math.random() * 255);
        int blue = (int) (Math.random() * 255);
        return new Color(red, green, blue);
    }
}
 
class Circle extends JComponent {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        var g2d = Factory.factoryGraphics2D(g);
        g2d.setColor(getBackground());
        g2d.fillOval(0, 0, getWidth(), getHeight());
    }
}
1
 Аватар для AlexProgramm
227 / 97 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
23.01.2023, 22:34  [ТС]
Пока слишком сложный код для меня
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
23.01.2023, 23:10
AlexProgramm, тут от меня разве что создание g2d, а так, просто иначе код распихал и таймер добавил.
0
 Аватар для AlexProgramm
227 / 97 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
23.01.2023, 23:26  [ТС]
Цитата Сообщение от Coffeini Посмотреть сообщение
e ->
Не знаю вот этого
JComponent
- вот этого не знаю

Пока что я на изучении GUI

Добавлено через 6 минут
И почему не задействован интерфейс ActionListener?
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
24.01.2023, 00:00
Цитата Сообщение от AlexProgramm Посмотреть сообщение
Не знаю вот этого
Лямбда выражение.
Цитата Сообщение от AlexProgramm Посмотреть сообщение
вот этого не знаю
В иерархии классов JComponent практически вверху. Вообще говоря, JPanel относится к контейнерам, а тк свойства контейнера нам в общем-то не нужны, то выбираем только свойства компонента.
Цитата Сообщение от AlexProgramm Посмотреть сообщение
не задействован интерфейс ActionListener?
Сверху писали, что можно воспользоваться анонимным классом. Лямбда выражения, в какой-то степени, они и есть.
0
 Аватар для AlexProgramm
227 / 97 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
24.01.2023, 00:09  [ТС]
Лямбда выражения еще не проходил
До JComponent немного не дошел.
Понял все.
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
24.01.2023, 00:11
AlexProgramm, вообще странно, что не проходили компоненты. Это как изучать юнити не зная ничего про гейм обжекты. Впрочем удачи.
1
 Аватар для AlexProgramm
227 / 97 / 32
Регистрация: 01.10.2022
Сообщений: 696
Записей в блоге: 47
24.01.2023, 00:34  [ТС]
Coffeini компоненты как раз следующая глава
0
 Аватар для IbnMong
135 / 62 / 13
Регистрация: 10.03.2022
Сообщений: 215
26.01.2023, 10:31
Coffeini, Куда в вашем случае подвешивать timer и как его правильно стартовать?
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
26.01.2023, 11:00
IbnMong, да я вроде даже в примере его в слушатель кнопки впихнул. Тут единственная проблема может возникнуть с остановкой...

Добавлено через 11 минут
Помню делал, класс анимации, на его основе. Но тут и точность избыточная, да и наверняка проще готовенькое найти.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2023, 11:00
Помогаю со студенческими работами здесь

По нажатию кнопки добавить Рисунок и задать движение по пораболе
Нужно чтобы могла создаваться неограниченное кол-во объектов, все двигаются по одной траектории, но с разными скоростями. Реализация через...

Необходимо задать движение обьекту после его создания на сцене по нажатию кнопки
Написал программу, в которой при нажатии на кнопку 1 перед персонажем создается обьект(в данном случае лампа). После блюпринта: SpawnActor...

Необходимо задать движение обьекту после его создания на сцене по нажатию кнопки
аписал программу, в которой при нажатии на кнопку 1 перед персонажем создается обьект(в данном случае лампа). После блюпринта: SpawnActor...

Движение круга по траектории круга
Написать программу для движения заданной фигуры по определенной траектории. Фигуры и траектории следующей конфигурации:круг и круг.

Добавление текстбоксов по нажатию клавиши и удаление по нажатию другой кнопки
Всем доброго времени суток. Хотел попросить помощи в написании следующего кода. Кое что набросал, но не работает при удалении...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru