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

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

22.01.2023, 22:05. Показов 1294. Ответов 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
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru