I was using this code placed here to generate bar-charts for my datasets. However, the colours were all the same (red in the code), so I decided to generate a colour ramp for this. I wrote the following code:

Color[] getColorRamp(int numColours)
{
    Color[] colours = new Color[numColours];
    int red_1 = 255; 
    int green_1 = 0; 
    int blue_1 = 0; 
    int red_2 = 0; 
    int green_2 = 0; 
    int blue_2 = 255; 

    int count = 0; 

    for (float t=0.0f;t<1.0f;t+=1.0/(float)numColours) {
        colours[count] = new Color((int)(t*red_2 + (1-t)*red_1),
                (int)(t*green_2 + (1-t)*green_1),
                (int)(t*blue_2 + (1-t)*blue_1),34); 

        //System.out.print((int)(t*red_2 + (1-t)*red_1) +",");
        //System.out.print((int)(t*green_2 + (1-t)*green_1) +",");
        //System.out.println((int)(t*blue_2 + (1-t)*blue_1));
    }
    return colours; 
}

It is here, where the problem starts. Only the first colour (pretty light blue) get rendered properly. Other colours are rendered as black! You can see that I have put System.out.println to verify the colours generated (commented in the code posted here). I saw that colours were generated as perfect RGB combinations.

The modified barchart function is posted here:

void drawBarChart(Graphics g, double[] values, String[] names, String title)
{ 

    if (values == null || values.length == 0)
        return;
    double minValue = 0;
    double maxValue = 0;
    for (int i = 0; i < values.length; i++) {
        if (minValue > values[i])
            minValue = values[i];
        if (maxValue < values[i])
            maxValue = values[i];
    }

    //Graphics2D g = (Graphics2D)gg; 

    Dimension d = getSize();
    int clientWidth = d.width;
    int clientHeight = d.height;
    int barWidth = clientWidth / values.length;

    Font titleFont = new Font("SansSerif", Font.BOLD, 20);
    FontMetrics titleFontMetrics = g.getFontMetrics(titleFont);
    Font labelFont = new Font("SansSerif", Font.PLAIN, 10);
    FontMetrics labelFontMetrics = g.getFontMetrics(labelFont);

    int titleWidth = titleFontMetrics.stringWidth(title);
    int y = titleFontMetrics.getAscent();
    int x = (clientWidth - titleWidth) / 2;
    g.setFont(titleFont);
    g.drawString(title, x, y);

    int top = titleFontMetrics.getHeight();
    int bottom = labelFontMetrics.getHeight();
    if (maxValue == minValue)
        return;
    double scale = (clientHeight - top - bottom) / (maxValue - minValue);
    y = clientHeight - labelFontMetrics.getDescent();
    g.setFont(labelFont);

    Color[] colours = getColorRamp(values.length);

    for (int i = 0; i < values.length; i++) {
        int valueX = i * barWidth + 1;
        int valueY = top;
        int height = (int) (values[i] * scale);
        if (values[i] >= 0)
            valueY += (int) ((maxValue - values[i]) * scale);
        else {
            valueY += (int) (maxValue * scale);
            height = -height;
        }

        g.setColor(colours[i]);
        g.fillRect(valueX, valueY, barWidth - 2, height);
        g.setColor(Color.black);
        g.drawRect(valueX, valueY, barWidth - 2, height);
        int labelWidth = labelFontMetrics.stringWidth(names[i]);
        x = i * barWidth + (barWidth - labelWidth) / 2;
        g.drawString(names[i], x, y);
    }       
    //paintComponent(g);
}

I wish to know, what mistake I am making!

有帮助吗?

解决方案

You're probably going to hit yourself on the head now. The reason it fails is that you forget to increase the variable count after setting the first colour, so you're constantly overwriting the first element of the Color array, and leaving all the other values in the array as their initial default (null).

Fixed code:

for (float t=0.0f;t<1.0f;t+=1.0/(float)numColours) {
    colours[count++] = new Color((int)(t*red_2 + (1-t)*red_1),
            (int)(t*green_2 + (1-t)*green_1),
            (int)(t*blue_2 + (1-t)*blue_1),34); 
}

(Notice the colours[count++])

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top