Domanda

I have created a graph in a Java applet and I'm trying to get the g.fillRect to auto adjust with the screen. I want the first bar to be a third of the screen and then to halve in size for each other bar.

g.fillRect(xpos, 550, width, hight);

I seem to have a problem with getting a gap in between each bar. Could you give me a hand with this problem? Thanks in advance.

È stato utile?

Soluzione

You have to compute the width of each individual bar, which is

barWidth = availableWidth / numberOfBars - 1

The "-1" will be the space that will be left between the bars, and thus, has to be added again when computing the actual coordinates. You could spend some time with the details there: When the numbers are not "nicely divisble", then the bars either have to have different widths, or you have to add a small margin at the left and right side to compensate for the odd size.

However, here is a quick sketch of one possible solution:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class BarChart
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.getContentPane().setLayout(new BorderLayout());

        final JSlider slider = new JSlider(1, 50, 3);
        final BarChartPanel barChartPanel = new BarChartPanel();
        slider.addChangeListener(new ChangeListener()
        {
            @Override
            public void stateChanged(ChangeEvent e)
            {
                barChartPanel.setNumberOfBars(slider.getValue());
            }
        });

        f.getContentPane().add(slider, BorderLayout.NORTH);
        f.getContentPane().add(barChartPanel, BorderLayout.CENTER);

        f.pack();
        f.setSize(600,600);
        f.setVisible(true);
    }
}


class BarChartPanel extends JPanel
{
    private int numberOfBars = 3;

    void setNumberOfBars(int n)
    {
        this.numberOfBars = n;
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        Random random = new Random(0);
        int barWidth = getWidth() / numberOfBars - 1;
        int barsWidth = numberOfBars * (barWidth+1);
        int offsetX = (getWidth() - barsWidth) / 2;
        for (int b=0; b<numberOfBars; b++)
        {
            int x = offsetX + b * (barWidth + 1);
            int barHeight = random.nextInt(500);
            int y = getHeight() - barHeight;
            g.fillRect(x, y, barWidth, barHeight);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top