Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Свойства линий


Автор: gromikiss 14.7.2005, 14:42
По перемещению мыши чертитяся линии (пример знаком я думаю). как написать прогу, что бы можно было щелкнуть на начерченой линии и посмотреть ее свойства, скажем начало линии или конец? smile

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
Гм... Программа несколько кривая...

Цитата(gromikiss @ 14.7.2005, 15:42)
как написать прогу, что бы можно было щелкнуть на начерченой линии и посмотреть ее свойства, скажем начало линии или конец?

Идея должна быть такова: нужно не просто рисовать линии на экране, но и сохранять их в какой-нибудь массив. Далее, при клике мышкой перебирать этот массив, и смотреть - есть у нас точка клика в массиве, или нет. Если есть - выводим информацию по линии, если нет - рисуем новую линию.


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
Замечание правильное, об этом я не подумал. Опыта нет. smile
Но это уже детали реализации.

Автор: gromikiss 14.7.2005, 15:56
Спасибо за советы мужики. Получается, что нужно создать массив переменных, каждая новая линия это новая переменная. М-да не утешили вы меня. Я думал если линия нарисована значит контейнер знает об этом, и хранит ее свойства. Насколько я знаю каждый объект при создании имеет уникальный код который можно посмотреть с помощью HashCode() или я ошибаюсь? smile

Автор: 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, 17:27)
есть ещё одно простое решение - проверяешь цвет под кликом и если попадешь...


В общем-то, нехороший вариант. Цвет поменяешь - и все. Не делается так.

Отдает студенческими лабами... smile (без обид)

Автор: Metal_Heart 14.7.2005, 16:32
а я бес претензий на гениальность smile

Автор: gromikiss 14.7.2005, 17:03
Короче мужики я так понял лучше создать объект Line2D со всеми свойствами и его уже прочерчивать smile ? Но как лучше организовать именование обьектов, случайным числом. ведь будут и линии и овалы и квадраты и круги smile

Автор: batigoal 14.7.2005, 17:10
А зачем его именовать?

Имхо, можно делать таким порядком: делаешь (или берешь готовый) класс Line, при необходимости наследуешь от него частные случаи линии. В нем делаешь ArrayList (или другую коллекцию), которая содержит все точки. При создании линии добавляешь ее в массив существующих линий.
Потом, когда будешь определять, входит ли точка в твою линию, пробежишься по списку линий, а в них - по списку точек.

Пара замечаний:
1. Алгоритм, конечно, неоптимальный.
2. Наверняка, в Java2D такие классы и средства уже есть, и велосипеда изобретать не нужно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)