1

我想用 java 和 Swing 制作一个条形图。我查看了以下链接中的代码 - http://www.java2s.com/Code/Java/2D-Graphics-GUI/Simplebarchart.htm

我想增加此图表中条形之间的空间。我该怎么做?

编码 -

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ChartPanel extends JPanel {
private double[] values;

private String[] names;

private String title;

public ChartPanel(double[] v, String[] n, String t) {
names = n;
values = v;
title = t;
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
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];
}

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);

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(Color.red);
  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);
}
}

public static void main(String[] argv) {
JFrame f = new JFrame();
f.setSize(400, 300);
double[] values = new double[3];
String[] names = new String[3];
values[0] = 1;
names[0] = "Item 1";

values[1] = 2;
names[1] = "Item 2";

values[2] = 4;
names[2] = "Item 3";

f.getContentPane().add(new ChartPanel(values, names, "title"));

WindowListener wndCloser = new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
    System.exit(0);
  }
};
f.addWindowListener(wndCloser);
f.setVisible(true);
}
} 
4

1 回答 1

1

这是您为条形设置 X 坐标的代码行:

int valueX = i * barWidth + 1;

要进一步移动每个条,您可以将其更改为:

int valueX = i * (barWidth+20) + 1;

您可以为此声明一个单独的类级别变量:

int barSpace = 20;

...//later in paintComponent.
int valueX = i * (barWidth+space) + 1;

更新:这是一行代码,计算barWidth

int barWidth = clientWidth / values.length;

为了使您的图表适合客户区域,您可以使用以下代码:

barWidth-= barSpace; //or barWidth-=20;

这样,您将从每个条形图上腾出一些空间

于 2013-03-04T08:47:04.597 回答