3

私は次のような状況にならなければなりません:

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;

参照が同じではないことに気付きました。ドー

4

2 に答える 2

2

アプローチとしては、ラインをパネルに追加された JComponents にして、それ自体を再描画させることです。これにより、線のロジックとペイントの計算を製図板に置くのではなく、線のクラスに分離するという優れた効果が得られる場合もあります。

于 2011-06-29T10:46:37.683 に答える
1

JDesktopPaneが受け入れられる「画板」である場合は、ここに示すアプローチを試すことができます。

于 2011-06-29T11:58:33.463 に答える