![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| gromikiss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 2.6.2005 Репутация: нет Всего: нет |
По перемещению мыши чертитяся линии (пример знаком я думаю). как написать прогу, что бы можно было щелкнуть на начерченой линии и посмотреть ее свойства, скажем начало линии или конец?
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.Line2D; import java.io.*; class SimpleWhiteboard extends JPanel{ public JButton saveButton; public int lastX=0, lastY=0; public SimpleWhiteboard(){ setPreferredSize(new Dimension(530,180)); setBorder(BorderFactory.createLineBorder(Color.yellow,3)); saveButton=new JButton("Ïðîáà"); JTextArea res = new JTextArea(10,20); setBackground(Color.RED); setFont(new Font("Serif",Font.BOLD,18)); add(res,BorderLayout.CENTER); add(saveButton,BorderLayout.SOUTH); addMouseListener(new PositionRecorder()); addMouseMotionListener(new LineDrawer()); } public void record(int x, int y){ lastX=x; lastY=y; } private class PositionRecorder extends MouseAdapter{ public void mouseEntered(MouseEvent event){ requestFocus(); record(event.getX(),event.getY()); } public void mousePressed(MouseEvent event) { record(event.getX(),event.getY()); } } public class LineDrawer extends MouseMotionAdapter{ Line2D line; public void mouseDragged(MouseEvent event){ int x=event.getX(); int y=event.getY(); Graphics g= getGraphics(); System.out.println(g.hashCode()); //Line line; Graphics2D k= (Graphics2D)g; g.setColor(Color.green); g.drawLine(lastX, lastY, x, y); System.out.println(g.hashCode()); record(x,y); System.out.println("X="+lastX); //Graphics k= getGraphics(); System.out.println(k.hashCode()); } } } |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Гм... Программа несколько кривая...
Идея должна быть такова: нужно не просто рисовать линии на экране, но и сохранять их в какой-нибудь массив. Далее, при клике мышкой перебирать этот массив, и смотреть - есть у нас точка клика в массиве, или нет. Если есть - выводим информацию по линии, если нет - рисуем новую линию. P.S. Пользуйся кнопкой "Код", когда вставляешь листинг исходника. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Metal_Heart |
|
|||
|
а почему бы и нет? ![]() ![]() Профиль Группа: Участник Сообщений: 728 Регистрация: 31.3.2005 Где: Москва Репутация: 1 Всего: 12 |
Lamer George несовсем так, ибо трудно попась по тонкой линии при большом разрешении,
а когда их будет много.. потребуется вычислять область (зону) клика в которой могут находится линии (пример - пересечение их) щелкаешь по координатам X,Y и проверяешь по условию X1 > X < X2 & Y1 > Y < Y2 а затем предлагать выбор - какую линию хошь? Это сообщение отредактировал(а) Metal_Heart - 14.7.2005, 15:35 -------------------- не стыдно учиться, а стыдно не учиться |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
Metal_Heart
Замечание правильное, об этом я не подумал. Опыта нет. Но это уже детали реализации. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| gromikiss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 2.6.2005 Репутация: нет Всего: нет |
Спасибо за советы мужики. Получается, что нужно создать массив переменных, каждая новая линия это новая переменная. М-да не утешили вы меня. Я думал если линия нарисована значит контейнер знает об этом, и хранит ее свойства. Насколько я знаю каждый объект при создании имеет уникальный код который можно посмотреть с помощью HashCode() или я ошибаюсь?
|
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
О хеш-коде тут недавно подробно говорили (http://forum.vingrad.ru/index.php?showtopic=51895), но дело в том, что ты не создаешь никаких объектов, когда делашь drawLine().
Это сообщение отредактировал(а) Lamer George - 14.7.2005, 16:04 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Metal_Heart |
|
|||
|
а почему бы и нет? ![]() ![]() Профиль Группа: Участник Сообщений: 728 Регистрация: 31.3.2005 Где: Москва Репутация: 1 Всего: 12 |
gromikiss кстати, есть ещё одно простое решение - проверяешь цвет под кликом и если попадешь...
-------------------- не стыдно учиться, а стыдно не учиться |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
В общем-то, нехороший вариант. Цвет поменяешь - и все. Не делается так. Отдает студенческими лабами... -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| Metal_Heart |
|
|||
|
а почему бы и нет? ![]() ![]() Профиль Группа: Участник Сообщений: 728 Регистрация: 31.3.2005 Где: Москва Репутация: 1 Всего: 12 |
а я бес претензий на гениальность
-------------------- не стыдно учиться, а стыдно не учиться |
|||
|
||||
| gromikiss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 2.6.2005 Репутация: нет Всего: нет |
Короче мужики я так понял лучше создать объект Line2D со всеми свойствами и его уже прочерчивать
|
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 7 Всего: 151 |
А зачем его именовать?
Имхо, можно делать таким порядком: делаешь (или берешь готовый) класс Line, при необходимости наследуешь от него частные случаи линии. В нем делаешь ArrayList (или другую коллекцию), которая содержит все точки. При создании линии добавляешь ее в массив существующих линий. Потом, когда будешь определять, входит ли точка в твою линию, пробежишься по списку линий, а в них - по списку точек. Пара замечаний: 1. Алгоритм, конечно, неоптимальный. 2. Наверняка, в Java2D такие классы и средства уже есть, и велосипеда изобретать не нужно. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |