Java 颜色代码在JUNG中占优势

Java 颜色代码在JUNG中占优势,java,jung,Java,Jung,我试图根据我收到的数据,使用JUNG生成一个动态图。我希望边缘自动进行颜色编码,而不是基于任何条件。我曾尝试使用此代码,但也失败了: Transformer<String, Paint> edgePaint = new Transformer<String, Paint>() { private final Color[] palette = {Color.GREEN, Color.YELLOW, Color.RED, Color.GRAY, C

我试图根据我收到的数据,使用JUNG生成一个动态图。我希望边缘自动进行颜色编码,而不是基于任何条件。我曾尝试使用此代码,但也失败了:

Transformer<String, Paint> edgePaint = new Transformer<String, Paint>() 
    {
        private final Color[] palette = {Color.GREEN, Color.YELLOW, Color.RED, Color.GRAY, Color.BLUE, Color.CYAN, Color.WHITE, Color.orange};
        int i=0;
        @Override
        public Paint transform(String graphEdge) 
        {
            if(i == 7)
            {
                i = 0;
            }
            else
            {
                i = i + 1;
            }
            return palette[i];

        }
    };
    viewer.getRenderContext().setEdgeDrawPaintTransformer(edgePaint);
Transformer edgePaint=新变压器()
{
私有最终颜色[]调色板={Color.GREEN、Color.YELLOW、Color.RED、Color.GRAY、Color.BLUE、Color.CYAN、Color.WHITE、Color.orange};
int i=0;
@凌驾
公共绘制变换(字符串图形边缘)
{
如果(i==7)
{
i=0;
}
其他的
{
i=i+1;
}
返回调色板[i];
}
};
viewer.getRenderContext().setEdgeDrawPaintTransformer(edgePaint);
我的边是字符串,无法预测是否设置了条件。我需要一种颜色的每一个边缘,而且,它不应该改变,当我放大和缩小。这可能吗?

(1)如果您真的想按顺序分配颜色,环绕列表(例如,R-g-B-R-g-B-R-g…),那么您可以定义一个贴图,并按自己喜欢的方式填充它(例如,遍历边并为每个边分配颜色)。然后让变压器返回

edgeColor.get(graphEdge)
(2) 如果您不关心颜色的使用顺序,或者偶尔重复,则可以获取边缘的哈希代码,将其修改为颜色列表的长度,然后返回:

palette[graphEdge.hashCode() % palette.length];

下面是一个关于边数近似值的示例答案:

这也避免了将同一颜色指定给多个边

  Transformer<String, Paint> edgePaint = new Transformer<String, Paint>() 
    {
        private final Color[] palette = {Color.GREEN, Color.YELLOW, Color.RED, Color.GRAY, Color.BLUE, Color.CYAN, Color.WHITE, Color.ORANGE};
        int[] boolFlag = new int[palette.length];

        @Override
        public Paint transform(String graphEdge) 
        {
            int colorNumber = Math.abs(graphEdge.hashCode() % palette.length);
            if(boolFlag[colorNumber] != 1)
            {
                boolFlag[colorNumber] = 1;
                return palette[colorNumber];
            }

            else
            {
                int i=0;
                for(i=0; i < palette.length; i++)
                    if(boolFlag[i] != 1)
                    {
                        colorNumber = i;
                        break;
                    }
                if( i == palette.length)
                {
                    for(i=0; i< palette.length; i++)
                        boolFlag[i] =0;
                }
                boolFlag[colorNumber] = 1;
                return palette[colorNumber];
            }
        }
    };
Transformer edgePaint=新变压器()
{
私有最终颜色[]调色板={Color.GREEN、Color.YELLOW、Color.RED、Color.GRAY、Color.BLUE、Color.CYAN、Color.WHITE、Color.ORANGE};
int[]boolFlag=newint[palete.length];
@凌驾
公共绘制变换(字符串图形边缘)
{
int colorNumber=Math.abs(graphEdge.hashCode()%palete.length);
if(boolFlag[colorNumber]!=1)
{
boolFlag[colorNumber]=1;
返回调色板[颜色编号];
}
其他的
{
int i=0;
对于(i=0;i
请澄清“自动彩色编码”的含义。您希望使用什么标准来确定边的颜色?对于要添加的每个边,我需要一种颜色。没有标准。添加第一边-添加颜色1添加第二边-添加颜色2添加第三边-颜色3非常感谢您,但是如果我放大或缩小图形,这些颜色会改变吗?不会。它们在当前实现中发生更改的原因是,每次调用transformer时,即每次重新绘制图形时,您都会为每条边选择一种新颜色。我提出的任何一种解决方案都会为每个边提供一致的颜色。(顺便说一句,基于您提出的问题,我建议您查看一些Java教程。)我现在才发现,每次缩放图形时都会重新绘制它。我习惯于使用jfreeChart,我们可以在其中设置颜色,但它不允许图形视图。再次感谢你。