2

私はしばらく JGraph を使用してきましたが、ラベルのクリッピングを true に設定すると、描画の問題が発生するようです。

上塗り例

次の煮詰めた例は、いじることができる実際のアプリケーションの問題を示しています。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;

import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;

/** it's an app! */
public class GraphApp extends JFrame {
    private mxGraph graph;
    private mxGraphComponent graphComponent;
    private boolean labelsClipped = false;

    /** @return the splitpane */
    public JSplitPane getSplitpane() {
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        graph = new mxGraph();
        graph.getModel().beginUpdate();
        graph.removeCells(graph.getChildCells(graph.getDefaultParent(), true, true));
        for (int i = 0; i < 10; i++)
            graph.insertVertex(null, null, "very_very_long_vertex_" + i, 10 * i, 10 * i, 100, 50);
        graph.getModel().endUpdate();
        graph.setLabelsClipped(labelsClipped);
        graphComponent = new mxGraphComponent(graph);
        JTextArea area = new JTextArea("There's overpaint below this text."); //$NON-NLS-1$
        splitPane.add(graphComponent, JSplitPane.LEFT);
        splitPane.add(area, JSplitPane.RIGHT);
        splitPane.setDividerLocation(70);
        return splitPane;
    }

    private JButton getButton() {
        JButton button = new JButton(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                labelsClipped = !labelsClipped;
                graph.setLabelsClipped(labelsClipped);
                GraphApp.this.repaint();
            }
        });
        button.setText("Swap setLabelsClipped");
        return button;
    }

    private JPanel getPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(getSplitpane(), BorderLayout.CENTER);
        panel.add(getButton(), BorderLayout.SOUTH);
        return panel;
    }

    public static void main(String[] args) {
        GraphApp app = new GraphApp();
        app.add(app.getPanel());
        app.setPreferredSize(new Dimension(300, 100));
        app.setVisible(true);
        app.pack();
    }
}

また、オーバーペイントは頂点の範囲内でのみ発生することに注意してください。切り抜きのある名前は次のとおりです。

クリップされていません

そしてクリッピングで:

切り取られた

問題がどこにあるのかを確認するために、現在 JGraphx ソースを調べています。以前にこれを回避した人はいますか?明らかに、graph.setLabelsClipped(false) を設定することで回避できますが、頂点ラベルが頂点の境界を超えて飛び散らないようにしたいと考えています。

4

1 に答える 1

2

問題がどこにあるかを見つけました。

com.mxgraph.view.mxGraph から、この小さなペイント コードを追加すると、クリップが誤って四角形に設定されていることがわかります。これは、私の例で証明されているように、実際のグラフ コンポーネントの外にある可能性があります。

        if (clippedCanvas instanceof mxGraphics2DCanvas)
        {
            System.out.println("setting new clip");
            Graphics g = ((mxGraphics2DCanvas) clippedCanvas).getGraphics();
            clip = g.getClip();
            g.setClip(newClip);
            ((mxGraphics2DCanvas) clippedCanvas).paintRectangle(((mxGraphics2DCanvas) clippedCanvas).getGraphics().getClipBounds(), Color.GREEN, Color.WHITE);
        }

ラベルが機能しているクリッピング領域をペイントすると、どこに問題があるかがわかります。

偽のクリッピング エリア

現実的には、元のキャンバスと新しいクリッピング四角形の交点のみをペイントする必要があります。この画像は、新しいクリッピング四角形によって踏みにじられる前のクリッピング四角形を示しています。

元のクリッピング エリア

これを修正するのは簡単です:

        if (clippedCanvas instanceof mxGraphics2DCanvas)
        {
            Graphics g = ((mxGraphics2DCanvas) clippedCanvas).getGraphics();
            clip = g.getClip();
            if (clip instanceof Rectangle)
            {
                g.setClip(newClip.intersection((Rectangle) clip));
            }
            else
            {
                g.setClip(newClip);
            }
        }

元のコードが意図的にクリップ設定を行ったかどうかを知りたいです。私はそれを疑います。

私の修正は、誰かがクリップの形状で奇妙なことをした場合に備えて、一種の CYA のようにデフォルトで実装されます。クリッピングは四角形以外で動作することが保証されていないため、おそらく必要ありません。

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html#setClip(java.awt.Shape)

コードはここ github にあるようです。そこで修正をプッシュできることを願っています。

https://github.com/jgraph/jgraphx

于 2013-09-13T19:03:25.480 に答える