java中的条形图

我想改变每个条的高度(例如,红色部分为10,蓝色部分为20)。 但是当我增加高度值时,它将从底部增加图表,而我希望更改为顶部! 你知道它有什么问题吗?

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[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 = 0) valueY += (int) ((maxValue - values[i]) * scale); else { valueY += (int) (maxValue * scale); height = -height; } g.setColor(Color.red); g.fillRect(valueX, valueY, barWidth - 80, height); g.setColor(Color.black); g.drawRect(valueX, valueY, barWidth - 80, height); g.setColor(Color.blue); g.fillRect(valueX, valueY + 20, barWidth - 80, height-20 ); g.setColor(Color.black); g.drawRect(valueX, valueY + 20, barWidth - 80, height-20 ); 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); } } 

因为Java的图形使用左上角作为原点,所以当你添加到高度时它会向下而不是向上增加。 尝试改变这个:

  g.setColor(Color.red); g.fillRect(valueX, valueY, barWidth - 80, height); g.setColor(Color.black); g.drawRect(valueX, valueY, barWidth - 80, height); 

对此:

  g.setColor(Color.red); g.fillRect(valueX, valueY - 20, barWidth - 80, height); g.setColor(Color.black); g.drawRect(valueX, valueY - 20, barWidth - 80, height); 

我尝试了这个,它添加到顶部栏的红色部分。

这是原始代码的镜头:

在此处输入图像描述

随着变化:

在此处输入图像描述