У меня следующая ситуация:
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'о