Отказ от ответственности: я не работал с 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));
person
Gyula
schedule
04.11.2011