2014-01-07 5 views
0

Решенные.Как сделать интерактивный график/строки в Java?

У меня был вопрос до этого, но это было очень плохо опубликовано, так что здесь оно идет снова, согласно лучшим правилам.

Я хочу, чтобы создать какой-то стиль графа, как это изображение:

enter image description here.

Он основан на законе физики, Snell's Law. На данный момент мне удалось нарисовать график сам с базовым Line2D.Double, который вы можете увидеть here (Line.java). Тогда все, что мне нужно сделать, это, в классе интерфейса, добавьте строки в массив в этом классе, так:

LinesArray.addLine(150 , 25 , 150 , 275); 

И каждый раз, когда он добавляет новый, он перерисовывает, как вы можете видеть в коде образец.

Но проблема в том, что я понятия не имею, как сделать это интерактивным. Я хотел сделать его интерактивным, как и в том, что вы могли бы на самом деле переместить эти строки и в то же время, при перемещении первой линии, второй будет двигаться в соответствии с формулой закона Снеллы, что:

n1 * грех (a1) = n2 * sin (a2)

Учитывая, что a1 - первый (левый) угол, a2 - второй (правый) угол в первом изображении.

Прекрасным примером того, что я надеюсь достичь, является this one. И если интерактивное движение слишком тяжелое (я нахожусь на расписании 2 дня), возможно также и this example.

Исправьте меня, если я ошибаюсь, но для второго, все, что мне нужно сделать, это вычислить координаты мыши и провести и вычислить все оттуда.

Here (menu_ui.java) - мой класс интерфейса, в котором метод, с которым я в настоящее время работает с линиями, является «menuSnell()» и here (Snell.java - это мой класс Snell, который содержит логику. Извинения за комментарии португальцев, но это довольно простой код, который вам действительно не нужен, чтобы понять, плюс я разделил его на читаемые методы.

В основном, мой вопрос заключается в том, как сделать эти линии интерактивными в том, как я описал выше.

Спасибо!

+1

Вам нужно добавить «MouseListener» к вашему компоненту, следить за щелчками мыши и определить, был ли щелчок на линии или нет ... – MadProgrammer

+0

Yup - это точно. Вам нужно: 1) Нарисуйте свое изображение на панели (или эквиваленте), 2) добавьте «MouseListener» (чтобы вызвать событие «что-то изменилось»), 3) у вас есть событие mouse «repaint()» вашего графического объекта и 4) подкласс «paint()» для вызова вашего графического кода. Вот хороший учебник: http://docs.oracle.com/javase/tutorial/2d/advanced/user.html – FoggyDay

ответ

1

Я не графический эксперт, но у меня была схожая работа давным-давно. У меня был объект, который мне нужно перекрасить. Я создал свой собственный JPanel, который содержит мои объекты, которые должны быть красками. Всякий раз, когда что-то менялось, я вызываю метод repaint на JPanel. Это выглядело так: http://sourceforge.net/p/scribbler-cvut/code/132/tree/Tuzka/src/cz/cvut/scribbler/panel/RewritableGlassPane.java.

private LinkedList<ColoredArea> background = new LinkedList<ColoredArea>(); 
/** 
* Vykreslí všechny položky v senamu vykreslených obrazců 
* @param g2d grafika k vykreslení 
*/ 
public void paintShape(Graphics2D g2d) { 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
    for (ColoredArea area : background) { 
     area.fill(g2d); 
    } 
    if (mouse != null && !block) { 
     g2d.setColor(mouse_color); 
     g2d.draw(mouse); 
    } 
    if (point!=null){ 
     SetPointsDialog.paintPoints(point, maxPoint, parent.getChildsSize(), g2d); 
    } 
} 

@Override 
public void paint(Graphics g) { 
    paintShape((Graphics2D) g); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    paintShape((Graphics2D) g); 
} 

Все, что мне нужно для рисования, хранилось в переменной фона. Когда что-то изменилось в LinkedList, я вызываю метод repaint() в окне.

У меня есть полный магазин исходного кода здесь: http://sourceforge.net/projects/scribbler-cvut/, но это был мой долгосрочный проект, поэтому он немного большой.

Смежные вопросы