私は次のような状況にならなければなりません:
AJPanel
は、他のブロック (Simulink や labView など) との相互接続に使用できる特定の接続ポイントを持つブロックをユーザーが追加できる「描画ボード」として使用されます。
ブロック自体はJPanel
、null レイアウトを設定した後に 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() メソッドを使用して、ブロックを製図板に追加します。以下は、そのような「ブロック」JPanel の MouseMotionListener です。
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 と JButton が含まれているだけです。ボタンは、ブロック間の接続を作成するために使用されます。接続リストは、上記の drawConnections 内で使用されます。
これ以上のものは本当にありません。
解決済み:
わかりました、予想通り、これは非常に細かい部分でした。
私が使用した線画コードでは
Graphics2D g2 = (Graphics2D) this.getGraphics();
それ以外の
Graphics2D g2 = (Graphics2D) g;
参照が同じではないことに気付きました。ドー