Рисование между JPanels - PullRequest
       18

Рисование между JPanels

3 голосов
/ 29 июня 2011

У меня следующая ситуация:

A JPanel - это «чертежная доска», где пользователь может добавлять блоки, имеющие определенные точки подключения, которые можно использовать для соединения с другими блоками (например, Simulink или labView).

Сами блоки - это JPanel объекты с кнопками на них, которые добавляются на чертежную доску методом add () после установки нулевого макета. JPanels можно перетаскивать с помощью MouseMotionListener.

Чтобы нарисовать соединения, я переопределяю метод paintComponent() на чертежной доске и вызываю g.drawLine () (после вызова super.paintComponent). Это работает, но как только вы перемещаете блок, линии перекрывают друг друга, и это превращается в беспорядок. Поэтому я звоню drawingBoard.repaint(), пока пользователь перемещает блок. Это приводит к тому, что во время перетаскивания линии мерцают, а затем сразу исчезают.

Очевидно, что рисунок JPanels в родительском JPanel мешает друг другу.

Как я могу решить эту проблему?

редактировать: некоторые фрагменты кода:

Доска для рисования:

public void paintComponent(Graphics g){
    g.clearRect(0, 0, getWidth(), getHeight());
    super.paintComponent(g);
    drawConnections(g);//Contains g.drawLine calls
}

Блоки добавляются в чертежную доску с помощью метода JPanel.add (). Ниже представлен MouseMotionListener такого «блока» JPanel.

public void mouseDragged(MouseEvent e)
{
    pt = SwingUtilities.convertPoint(movingPanel, e.getX(), e.getY(), movingPanel.getParent());
    movingPanel.setBounds(pt.x - clickX, pt.y - clickY, movingPanel.getWidth(), movingPanel.getHeight());
    e.consume();

    movingPanel.getParent().repaint();
}

Блок JPanel не переопределяет paintComponent, потому что в нем нет необходимости в специальном рисовании. Он просто содержит несколько JLabels и JButtons. Кнопки используются для создания связей между блоками. Затем список соединений используется внутри drawConnections, упомянутого выше.

Там действительно не намного больше, чем это.

РЕШИТЬ:

Хорошо, как и ожидалось, это была очень маленькая деталь.

В коде рисования линий я использовал

Graphics2D g2 = (Graphics2D) this.getGraphics();

вместо

Graphics2D g2 = (Graphics2D) g;

Я только что заметил, что ссылки не совпадают. D'о

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

При подходе можно сделать так, чтобы линии были JComponents, которые были добавлены на панель, и чтобы они перекрашивались самостоятельно.Это также может иметь приятный эффект, заключающийся в том, что вы изолируете логику линий и вычисление рисования в классе линий вместо того, чтобы использовать их на чертежной доске.

1 голос
/ 29 июня 2011

Если JDesktopPane является приемлемой «чертежной доской», вы можете попробовать подход, показанный здесь .

...