在Java中创建简单条形图 - 读取数据和输出条形图

时间:2015-04-26 04:48:16

标签: java swing graph jpanel joptionpane

我需要为我的一个项目创建一个简单的条形图。该程序需要输入1到9个大于零的整数。然后,程序需要显示一个非常简单的条形图,其中整数显示在条形图上方。我的教授没有很好地向我解释这个程序,这是第一次使用图形。

该计划要求:

一个班级" SimpleBarChart" (它将扩展Frame)与私有变量Bar [] bars和int [] inputData等(如私有图形g,私有int windowWid,windowHt等)和以下函数。它还使用辅助类Bars,如下所示:

class Bar
{ public int height, width, value, nix, nwy;
  public Bar() {}
  public Bar(int height, int width, int value, int nix, int nwy)
  { this.height = height; etc }
}

接下来是构造函数SimpleBarChart(),它调用readData(),createBars()和drawBars()。

一个函数private void readData(),它读取条形图的inputData。使用下面给出的代码,它使用JOptionPane。

一个函数private void createBars(),用于在指定每个条的宽度,高度,值(bars [i] .value = inputData [i]),nix和nwy时创建bars数组。在显示窗口的顶部和底部需要25个像素的空间,在条形图之间需要10个像素,并且必须允许将条形高度缩放为inputData项目的形式。

最后一个函数private void drawBars()用于绘制条形图,一次一个,条形图之间具有合适的休眠时间,具有两种不同的颜色。需要使用g.drawString("" + b.value,nix + b.width / 2,nwy-10)将黑色b中的每个条形标记为高于其顶部10个像素的值。 / p>

我一直试图弄清楚这一天,我迷失了。任何帮助将不胜感激!

到目前为止我的代码是什么:

package simplebarchart;

import java.awt.*;
import java.awt.event.*;
import java.awt.Toolkit.*;
import javax.swing.*;
import java.io.*;
import java.util.*;


public class SimpleBarchart extends JFrame
{
    private final int OUTER_MARGIN = 20;
    private static final Color BACKGROUND_COLOR = Color.white;
    private static final Color BAR_COLOR = Color.red; 
    private int SPACE_ON_LEFT_RIGHT;
    private Image fImageBuffer;
    private Insets fInsets;
    private Graphics g;
    private Bar[] bars;
    private static int SLEEP = 500;
    private int[] inputData;


class Bar
{
    private int height, value;
    public int width;
    public int nwx;
    public int nwy;
    public Color color;

    public Bar() {}
    public Bar(int height, int width, int value, int nwx, int nwy)
    {
        this.height = height;
        this.width = width; 
        this.value = value; 
        this.nwx = nwx;
        this.nwy = nwy;
    }

}


public SimpleBarchart(final int[] inputData)
{
    this.inputData = inputData;
    addWindowListener(new WindowCloser());
    fInsets = getInsets();
    setSize(WIDTH + fInsets.left + fInsets.right, HEIGHT + fInsets.top + fInsets.bottom);
    setTitle("Bar Chart");
    if (((fImageBuffer = createImage(WIDTH, HEIGHT)) == null) ||
            ((g = fImageBuffer.getGraphics()) == null))
            System.exit(1);
    readData();
    createBars();
    getContentPane().add(new SimpleBarchart(inputData), BorderLayout.CENTER);
    setVisible(true);
}

/**
 *
 * @param g
 */
protected void paintComponent(final Graphics g) {
    g.drawImage(fImageBuffer, fInsets.left, fInsets.top, null);
}

class WindowCloser extends WindowAdapter
{
    @Override
    public void windowClosing(WindowEvent e)
    {
        System.exit(0);
    }
}

private void readData()
{
    String[] inputItems = JOptionPane.showInputDialog("Enter 1 to 9 integers > 0").trim().split(" +");
    int numData = inputItems.length;
    inputData = new int[numData];

    for (int itemIndex = 0; itemIndex < inputItems.length; itemIndex++)
        inputData[itemIndex] = numData;


}

private void createBars()
{

//Im confused on how to create the bars for this program. 
//This function requires 25 pixels of space on top and bottom of the display-    window, 10 pixels between the bars, and has to allow bar-heights to be **scaled to the form of inputData items.** 

    Bar[] bars = new Bar[];
    int pixelBetweenBars = 25;
    int width = 800 + 2*OUTER_MARGIN;
    int height = 600 + 2*OUTER_MARGIN;

}

private void drawBars(final Graphics g)
{
            int OUTER_MARGIN = 20,
            WIDTH = 800 + 2 * OUTER_MARGIN,
            HEIGHT = 600 + 2 * OUTER_MARGIN;


    g.setColor(BACKGROUND_COLOR);
    g.fillRect(0, 0, WIDTH, HEIGHT);

    g.setColor(BAR_COLOR);
    final int barWidth = 20;
    for (int itemIndex = 0; itemIndex < inputData.length; itemIndex++) {
        final int x = OUTER_MARGIN + 25 * itemIndex;
        final int barHeight = 10 * inputData[itemIndex];
        final int y = barHeight;
        g.fillRect(x, y, barWidth, barHeight);
    }
}


public static void main(String[] args) 
{
    new SimpleBarchart;
}

1 个答案:

答案 0 :(得分:1)

我同意Uttesh Kumar JFreeChart是一个优秀的图表库,花时间学习它真的是值得的。但是,由于您正在进行此项目以了解有关图形的更多信息,因此最好自己编写图形。

首先是一些一般性评论:

  • Bar类定义了两次,两种实现都没有使用;
  • createImage([...], [...]).getGraphics()建筑看起来很奇特;
  • readData方法读取空格分隔的数字列表,分配内存,但不存储数字(您可以在此使用Bar类);
  • createBars方法当前声明了三个尚未使用的局部变量(并且没有其他任何内容)。

Performing Custom Painting已经推荐的MadProgrammer教程所示,自定义绘制的常用方法是通过继承JPanel类并覆盖paintComponent方法。 学习这个简短的教程可以让你快速上手,所以我真的同意这个建议!

readData方法中,您可以添加几行来存储数字(并稍后切换到使用Bar类):

for (int itemIndex = 0; itemIndex < inputItems.length; itemIndex++)
    inputData[itemIndex] = [...get a number from the inputItems string here...];

在构造函数中调用readData之后,您可以添加:

getContentPane().add(new SimpleBarPanel(inputData), BorderLayout.CENTER);
setVisible(true);

这使用一个新的SimpleBarPanel类来处理自定义绘画。 (如果您希望显示setVisible绘画,则对SimpleBarPanel的调用应该是最后一次。)

SimpleBarPanel类可能如下所示:

import java.awt.*;
import javax.swing.*;

public class SimpleBarPanel extends JPanel {
    private static final Color BACKGROUND_COLOR = Color.white;
    private static final Color BAR_COLOR = Color.red;

    private int[] inputData;

    public SimpleBarPanel(final int[] inputData) {
        this.inputData = inputData;
    }

    @Override
    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);

        drawBars(g);
    }

    private void drawBars(final Graphics g) {
        int /*i,*/ OUTER_MARGIN = 20,
                WIDTH = 800 + 2 * OUTER_MARGIN,
                HEIGHT = 600 + 2 * OUTER_MARGIN;
                /*SPACE_BETWEEN_BARS = 10, SPACE_ON_TOP_BOTTOM = 25;*/

        g.setColor(BACKGROUND_COLOR);
        g.fillRect(0, 0, WIDTH, HEIGHT);

        g.setColor(BAR_COLOR);
        final int barWidth = 20;
        for (int itemIndex = 0; itemIndex < inputData.length; itemIndex++) {
            final int x = OUTER_MARGIN + 25 * itemIndex;
            final int barHeight = 10 * inputData[itemIndex];
            final int y = [...y is calculated using barHeight; the higher the bar, the lower y should be...];
            g.fillRect(x, y, barWidth, barHeight);
        }
    }
}

祝你的项目好运。