| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > Свойства линий |
| Автор: gromikiss 14.7.2005, 14:42 |
| По перемещению мыши чертитяся линии (пример знаком я думаю). как написать прогу, что бы можно было щелкнуть на начерченой линии и посмотреть ее свойства, скажем начало линии или конец? 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 14.7.2005, 15:03 | ||
Гм... Программа несколько кривая...
Идея должна быть такова: нужно не просто рисовать линии на экране, но и сохранять их в какой-нибудь массив. Далее, при клике мышкой перебирать этот массив, и смотреть - есть у нас точка клика в массиве, или нет. Если есть - выводим информацию по линии, если нет - рисуем новую линию. P.S. Пользуйся кнопкой "Код", когда вставляешь листинг исходника. |
| Автор: Metal_Heart 14.7.2005, 15:33 |
| Lamer George несовсем так, ибо трудно попась по тонкой линии при большом разрешении, а когда их будет много.. потребуется вычислять область (зону) клика в которой могут находится линии (пример - пересечение их) щелкаешь по координатам X,Y и проверяешь по условию X1 > X < X2 & Y1 > Y < Y2 а затем предлагать выбор - какую линию хошь? |
| Автор: batigoal 14.7.2005, 15:38 |
| Metal_Heart Замечание правильное, об этом я не подумал. Опыта нет. Но это уже детали реализации. |
| Автор: gromikiss 14.7.2005, 15:56 |
| Спасибо за советы мужики. Получается, что нужно создать массив переменных, каждая новая линия это новая переменная. М-да не утешили вы меня. Я думал если линия нарисована значит контейнер знает об этом, и хранит ее свойства. Насколько я знаю каждый объект при создании имеет уникальный код который можно посмотреть с помощью HashCode() или я ошибаюсь? |
| Автор: batigoal 14.7.2005, 16:03 |
| О хеш-коде тут недавно подробно говорили (http://forum.vingrad.ru/index.php?showtopic=51895), но дело в том, что ты не создаешь никаких объектов, когда делашь drawLine(). |
| Автор: Metal_Heart 14.7.2005, 16:27 |
| gromikiss кстати, есть ещё одно простое решение - проверяешь цвет под кликом и если попадешь... |
| Автор: batigoal 14.7.2005, 16:31 | ||
В общем-то, нехороший вариант. Цвет поменяешь - и все. Не делается так. Отдает студенческими лабами... |
| Автор: Metal_Heart 14.7.2005, 16:32 |
| а я бес претензий на гениальность |
| Автор: gromikiss 14.7.2005, 17:03 |
| Короче мужики я так понял лучше создать объект Line2D со всеми свойствами и его уже прочерчивать |
| Автор: batigoal 14.7.2005, 17:10 |
| А зачем его именовать? Имхо, можно делать таким порядком: делаешь (или берешь готовый) класс Line, при необходимости наследуешь от него частные случаи линии. В нем делаешь ArrayList (или другую коллекцию), которая содержит все точки. При создании линии добавляешь ее в массив существующих линий. Потом, когда будешь определять, входит ли точка в твою линию, пробежишься по списку линий, а в них - по списку точек. Пара замечаний: 1. Алгоритм, конечно, неоптимальный. 2. Наверняка, в Java2D такие классы и средства уже есть, и велосипеда изобретать не нужно. |