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

смещение при добавлении компонента на панель

15.04.2016, 08:51. Показов 1166. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Реализуя анимация соударения множества шаров друг о друга наткнулся на одну проблему:
Шары - экземпляры класса Ellipse2D, отрисовываю внутри класса Ball расширяющего JPanel. Получается что для каждого изображения шара - своя панель. Размеры панели соответствуют размерам шара. Проблема в том, что хоть размеры шара и панели его содержащей одинаковы, их центры не совпадают. Это становится заметно при обработке столкновений шаров: в одном случае они отскакивают от стены и друг друга даже не коснувшись, в другом сперва "срастаются" о потом происходит реакция на столкновение. Кто может знать в чем проблема - подскажите пожалуйста или скиньте ссылку где можно подробно об этом узнать. Ниже привожу код:

Класс шаров:
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
package simple9PG;
 
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.ArrayList;
 
public class Ball extends JComponent {
    private static ArrayList<Ball> balls = new ArrayList<>();
 
    //проверяем столкновение шаров друг с другом и границами фрейма, и перемещаем их.
    static void moveAndDetection(JFrame frame) {
        for (int i = 0; i < balls.size(); i++) {
            //проверим столкновение с границами фрейма
            Ball ball = balls.get(i);
            if (ball.getX() + ball.speedX + ball.radius > frame.getWidth()) {
                ball.speedX *= -1;
            } else if (ball.getX() + ball.speedX - ball.radius < 0) {
                ball.speedX *= -1;
            }
 
            if (ball.getY() + ball.speedY + ball.radius > frame.getHeight()) {
                ball.speedY *= -1;
            } else if (ball.getY() + ball.speedY - ball.radius < 0) {
                ball.speedY *= -1;
            }
 
            //проверим столкновение с другими шарами
            for (int j = i + 1; j < balls.size(); j++) {
                Ball otherBall = balls.get(j);
                int x = (ball.getX() - ball.radius) - (otherBall.getX() - otherBall.radius);
                int y = (ball.getY() - ball.radius) - (otherBall.getY() - otherBall.radius);
                double xy = Math.sqrt(x * x + y * y);
 
                //упрощенная реакция на столкновение шаров
                if (xy <= ball.radius + otherBall.radius) {
                    float sX = ball.speedX;
                    float sY = ball.speedY;
                    float sumSpeedX = Math.abs(ball.speedX) + Math.abs(otherBall.speedX);
                    float sumSpeedY = Math.abs(ball.speedY) + Math.abs(otherBall.speedY);
 
 
                    ball.speedX = otherBall.speedX;
                    ball.speedY = otherBall.speedY;
 
                    otherBall.speedX = sX;
                    otherBall.speedY = sY;
                }
            }
 
            ball.setLocation(ball.getX() + (int)ball.speedX, ball.getY() + (int)ball.speedY);
        }
    }
 
    private float speedX;
    private float speedY;
    private Color color;
    private int radius;
 
    public Ball(float speed, int radius) {
        balls.add(this);
        this.radius = radius;
        speedX = speed;
        speedY = -speed;//speedY можно сделать положительным - разницы нет.
 
        setSize(radius * 2, radius * 2);
        setLocation((int)(Math.random() * (550 - radius * 2)),
                 (int)(Math.random() * (500 - radius * 2)));
 
        //установим случайный цвет для шарика
        color = new Color((int)(Math.random() * 255), (int)(Math.random() * 255),
                               (int)(Math.random() * 255));
    }
 
    @Override
    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
 
        Ellipse2D ellipse = new Ellipse2D.Float(0, 0, radius * 2, radius * 2);
        g2.setColor(color);
        g2.fill(ellipse);
    }
 
}
Класс фрейма:
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
package simple9PG;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class Bouns {
    private Timer timer;
    private JFrame frame;
 
    public  Bouns() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(550, 550);
 
                frame.setLayout(null);
                frame.add(new Ball(5, 20));
                frame.add(new Ball(4, 30));
                frame.add(new Ball(3, 25));
                frame.add(new Ball(4, 27));
                frame.add(new Ball(1, 35));
                frame.add(new Ball(2, 40));
                frame.add(new Ball(4, 22));
                frame.add(new Ball(6, 23));
                frame.add(new Ball(12, 15));
 
                timer = new Timer(30, new TimerListener());
                timer.start();
 
                frame.setVisible(true);
            }
        });
    }
 
    private class TimerListener implements ActionListener{
 
        @Override
        public void actionPerformed(ActionEvent event) {
            Ball.moveAndDetection(simple9PG.Bouns.this.frame);
        }
 
    }
 
}
Класс - точка входа в программу:
Java
1
2
3
4
5
6
7
8
9
import simple9PG.Bouns;
 
public class Main {
 
    public static void main(String[] args) {
        Bouns bouns = new Bouns();
    }
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2016, 08:51
Ответы с готовыми решениями:

Создание компонента, при добавлении автоматически получить Parent фокусированного компонента
Привет всем, вот ни разу не писал еще компоненты, начал разбираться, все просто, понятно, доступно, удобно.. но как мне задать Parent...

Отменить смещение блоков при динамическом добавлении текста
Спасибо большое. Ещё вопрос есть один. Есть скрипт который при нажатии на кнопку выводит текст посередине, но при этом все блоки смещаются...

Ошибка при добавлении компонента на форму
причем на форме уже есть компоненты.. выдает ошибку в адрессе и ссылается на модуль rtl60.bpl в помощи у справки такой заголовок...

1
 Аватар для Aliara
18 / 18 / 13
Регистрация: 18.06.2015
Сообщений: 79
15.04.2016, 12:38
Java
1
2
int x = (ball.getX() + ball.radius) - (otherBall.getX() + otherBall.radius);
int y = (ball.getY() + ball.radius) - (otherBall.getY() + otherBall.radius);
Однако, иногда шары сцепляются. Я думаю, что из-за условия <= в
Java
1
xy <= ball.radius + otherBall.radius
Так же, стоит проверять, чтобы у вас шары не были сцеплены изначально
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2016, 12:38
Помогаю со студенческими работами здесь

Ошибка при добавлении компонента управления
Здравствуйте, на днях начал изучать wpf, походу доигрался и при добавлении любого компонента на обычную форму у меня вылазит окно с...

Ошибка при добавлении компонента на форму
Здравствуйте! Проблема в том что при добавлении нового компонента на форму часто бывает так что после компиляции в тех или иных случаях...

Ошибка при добавлении компонента в существующий пакет
Кто знает, подскажите. Пол дня мучаюсь. Написал для пробы свой компонент Component-&gt;New Component - кнопка CountBtn -наследник...

Ругается при добавлении компонента EDIT на форму
Здравствуйте товарищи программисты :) Ситуация следующая, создаю новый проект, сохраняю его в указанную папку, добавляю на форму...

Сохранить размер компонента при добавлении в JPanel
Здравствуйте! У меня есть панель JPanel, у которой установлен менеджер компоновки TabelLayout. Туда я добавляю JComboBox, но он весь...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru