Как обрабатывать настраиваемый, выбираемый класс линий в Java

У меня есть приложение, в котором я хотел бы, чтобы пользователь мог навести указатель мыши и/или щелкнуть правой кнопкой мыши на линии, которая рисуется на JPanel. Я полностью ожидаю, что реализую линию как часть объекта, который будет обрабатывать все поведение, но у меня есть более фундаментальный вопрос о том, как реализовать линию, показанную на рисунке ниже. Во-первых, картинка:

Стрелка между двумя шасси

Я могу нарисовать саму линию без каких-либо проблем, но в настоящее время это просто делается в переопределенном вызове paintComponent() в родительском JPanel. У меня есть зачатки идеи о том, как справиться с этим:

public class ChassisLink extends JComponent implements MouseListener
{
  //Rectangle  to handle mouse-over and right-click for each segment?
    public ChassisLink()
{
    initializeLink();
}

private void initializeLink()
{
    //Init stuff
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
                //Paint the line(s)
}
        //MouseListener events...
//When mouse-over on the line, display a tooltip
//When right clicking, display a different dialog
}

Проблема, которую, я думаю, я не понимаю, заключается в том, как выполнить проверку наведения мыши или щелчка. Должен ли я использовать прямоугольник и проверять, содержится ли мышь в данный момент в этом прямоугольнике, просто игнорируя треугольные части стрелок? Я совершенно оптимистичен по этому поводу. Тогда моя проблема заключается в том, как я буду отображать эти объекты ссылок поверх существующей панели JPanel, содержащей объекты шасси; это звучит как кандидат на JLayeredPane, но есть ли подтверждение на этом пути?

В любом случае, я ценю любой вклад, который люди могут дать мне. Не стесняйтесь просить дополнительных объяснений, если что-то немного расплывчато.

Спасибо,

-Богатый


person Rich Hoffman    schedule 24.05.2012    source источник


Ответы (1)


Ты на правильном пути. Я бы порекомендовал использовать Area вместо Rectangle — таким же образом можно получить стрелки, а Area чрезвычайно легко манипулировать с помощью AffineTransforms.

person ControlAltDel    schedule 24.05.2012