Отказ от ответственности: я не работал с API, только что проверил документацию :) Кажется, что API имеет интерфейс EdgeRenderer, который вы должны реализовать для достижения желаемого поведения.
Ссылка: http://prefuse.org/doc/manual/introduction/example/, http://prefuse.org/doc/api/prefuse/render/DefaultRendererFactory.html
Обновление: сначала исправление: на самом деле EdgeRenderer - это не интерфейс, а класс. Я сделал простую демонстрацию, чтобы проиллюстрировать, как реализовать пользовательский рендеринг края
Особенность
Добавить метку к ребрам, содержащим инициалы меток узла
Метод
Я сделал быстрое и грязное решение, которое копируется в LabelRenderer и модифицируется для обработки краев.
код
Я назвал класс MyEdgeRenderer
:
public class MyEdgeRenderer extends AbstractShapeRenderer {
используйте исходный EdgeRenderer
для рисования линий ребер (см. render()
ниже для рендерера в действии):
protected EdgeRenderer m_edgeRenderer = new EdgeRenderer();
изменить getText()
, чтобы получить инициалы из узлов:
protected String getText(VisualItem item) {
EdgeItem edge = (EdgeItem)item;
VisualItem item1 = edge.getSourceItem();
VisualItem item2 = edge.getTargetItem();
String t1 = null, t2 = null;
if ( item1.canGetString(m_labelName) ) {
t1 = item1.getString(m_labelName).substring(0,1);
};
if ( item2.canGetString(m_labelName) ) {
t2 = item2.getString(m_labelName).substring(0,1);
};
if (t1 != null && t2 != null)
return t1 + "-" + t2;
else
return null;
}
изменено getAlignedPoint()
, чтобы расположить этикетку наполовину по краю:
protected void getAlignedPoint(Point2D p, VisualItem item,
double w, double h, int xAlign, int yAlign)
{
double x=0, y=0;
EdgeItem edge = (EdgeItem)item;
VisualItem item1 = edge.getSourceItem();
VisualItem item2 = edge.getTargetItem();
// label is positioned to the center of the edge
x = (item1.getX()+item2.getX())/2;
y = (item1.getY()+item2.getY())/2;
...
изменить render()
, чтобы (I) сначала нарисовать линию и (II) использовать черный цвет:
public void render(Graphics2D g, VisualItem item) {
m_edgeRenderer.render(g, item);
...
// render text
int textColor = ColorLib.color(Color.BLACK); // item.getTextColor()
if ( text != null && ColorLib.alpha(textColor) > 0 ) {
...
Для тестирования я модифицировал образец, найденный на сайте Prefuse (http://prefuse.org/doc/manual/introduction/example/Example.java):
// -- 3. the renderers and renderer factory ---------------------------
// draw the "name" label for NodeItems
LabelRenderer ir = new LabelRenderer("name");
ir.setRoundedCorner(8, 8); // round the corners
// draw the "name" initials for EdgeItems
MyEdgeRenderer er = new MyEdgeRenderer("name");
er.setRoundedCorner(8, 8); // round the corners
// create a new default renderer factory
// return our name label renderer as the default for all non-EdgeItems
// includes straight line edges for EdgeItems by default
vis.setRendererFactory(new DefaultRendererFactory(ir, er));
Это просто демонстрация, иллюстрирующая пользовательский рендеринг. В действительности вы, вероятно, получите текст и цвет метки из модели графика, например: EdgeItem.getString(), getTextColor()
. Я думаю, что оба атрибута могут быть получены из данных GraphML. Также пример кода показывает, как установить цвета для узлов, он может быть адаптирован и для ребер (хотя я не пробовал):
// -- 4. the processing actions ---------------------------------------
...
// use black for node text
ColorAction text = new ColorAction("graph.nodes",
VisualItem.TEXTCOLOR, ColorLib.gray(0));