我需要为我的一个项目创建一个简单的条形图。该程序需要输入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;
}
答案 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);
}
}
}
祝你的项目好运。