2013-09-13 4 views
2

Я работал с JGraph на некоторое время и, кажется, есть проблема картины, когда вы установите метку отсечение верно:Vertex метка картины вне вершины, над скроллингом и на других компоненты, когда setLabelsClipped верно

Overpainting example

следующая вареные вниз пример показывает проблему в живом приложении, которое вы можете связываться с:

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(); 
    } 
} 

интересно также отметить, что преувеличивать происходит только в пределах границ вершины , Вот имена с отсечения от:

Not Clipped

И закрепляя:

Clipped

Я теперь, глядя в источник JGraphx, чтобы увидеть, где проблема. Кто-нибудь работал над этим раньше? Очевидно, что установка graph.setLabelsClipped (false) работает вокруг него, но я предпочел бы, чтобы мои вершинные метки не выходили за пределы моих вершин.

+0

Это в JGraphX ​​1.12.0.2. Я загружаю последнее, чтобы узнать, было ли оно адресовано в более поздних версиях. – Amish

+0

Похоже, он все еще существует в jgraphx-2_1_1_2. – Amish

ответ

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); 
     } 

Если мы нарисуем область отсечения, с которой работает метка, мы можем видеть, где лежит проблема.

Bogus Clipping Area

Реалистично, мы должны быть картины только пересечение оригинального холста, и новый прямоугольник отсечения. Это изображение показывает, что отсечение прямоугольник был перед тем, как топтали новым:

Original Clipping Area

Исправление это просто один:

 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

+0

Запрос на утянутый запрос был добавлен: https://github.com/jgraph/jgraphx/pull/17 – Amish