Java 需要编辑条形图的swing GUI代码
我想用java和Swing制作一个条形图。我在下面的链接中查看了代码- 我想增加此图表中条形之间的间距。我该怎么做 该守则—Java 需要编辑条形图的swing GUI代码,java,swing,Java,Swing,我想用java和Swing制作一个条形图。我在下面的链接中查看了代码- 我想增加此图表中条形之间的间距。我该怎么做 该守则— 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.
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);
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入java.awt.event.WindowListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类ChartPanel扩展了JPanel{
私人双重价值观;
私有字符串[]名称;
私有字符串标题;
公共图表面板(双[]v,字符串[]n,字符串t){
名称=n;
数值=v;
title=t;
}
公共组件(图形g){
超级组件(g);
if(value==null | | values.length==0)
返回;
双最小值=0;
双最大值=0;
对于(int i=0;i值[i])
最小值=值[i];
if(最大值<值[i])
最大值=值[i];
}
维度d=getSize();
int clientWidth=d.width;
int clientHeight=d.高度;
int barWidth=clientWidth/values.length;
字体标题字体=新字体(“SansSerif”,Font.BOLD,20);
FontMetrics titleFontMetrics=g.getFontMetrics(titleFont);
Font labelFont=新字体(“SansSerif”,Font.PLAIN,10);
FontMetrics-labelFontMetrics=g.getFontMetrics(labelFont);
int titleWidth=titleFontMetrics.stringWidth(标题);
int y=titleFontMetrics.getAscent();
intx=(clientWidth-titleWidth)/2;
g、 setFont(标题字体);
g、 抽绳(标题,x,y);
int top=titleFontMetrics.getHeight();
int bottom=labelFontMetrics.getHeight();
如果(maxValue==minValue)
返回;
双刻度=(clientHeight-顶部-底部)/(maxValue-minValue);
y=clientHeight-labelFontMetrics.getDescent();
g、 setFont(labelFont);
对于(int i=0;i=0)
valueY+=(int)((maxValue-values[i])*刻度;
否则{
valueY+=(int)(最大值*刻度);
高度=-高度;
}
g、 setColor(Color.red);
g、 fillRect(valueX、valueY、条形宽度-2、高度);
g、 设置颜色(颜色为黑色);
g、 drawRect(valueX、valueY、杆宽-2、高度);
int-labelWidth=labelFontMetrics.stringWidth(名称[i]);
x=i*barWidth+(barWidth-labelWidth)/2;
g、 抽绳(名称[i]、x、y);
}
}
公共静态void main(字符串[]argv){
JFrame f=新的JFrame();
f、 设置大小(400300);
double[]值=新的double[3];
字符串[]名称=新字符串[3];
数值[0]=1;
名称[0]=“项目1”;
数值[1]=2;
名称[1]=“第2项”;
数值[2]=4;
名称[2]=“第3项”;
f、 getContentPane().add(新的图表面板(值、名称、“标题”);
WindowListener wndCloser=新的WindowAdapter(){
公共无效窗口关闭(WindowEvent e){
系统出口(0);
}
};
f、 addWindowListener(wndCloser);
f、 setVisible(真);
}
}
这是一行代码,您可以在其中设置条形图的X坐标:
int valueX = i * barWidth + 1;
要进一步移动每个条,可以将其更改为:
int valueX = i * (barWidth+20) + 1;
您可以为此声明单独的类级别变量:
int barSpace = 20;
...//later in paintComponent.
int valueX = i * (barWidth+space) + 1;
更新:这是一行计算条码宽度的代码:
int barWidth = clientWidth / values.length;
要使图表适合客户端区域,可以使用以下代码:
barWidth-= barSpace; //or barWidth-=20;
通过这种方式,您将从每个条中获得一些空间以下是一行代码,您可以在其中设置条的X坐标:
int valueX = i * barWidth + 1;
要进一步移动每个条,可以将其更改为:
int valueX = i * (barWidth+20) + 1;
您可以为此声明单独的类级别变量:
int barSpace = 20;
...//later in paintComponent.
int valueX = i * (barWidth+space) + 1;
更新:这是一行计算条码宽度的代码:
int barWidth = clientWidth / values.length;
要使图表适合客户端区域,可以使用以下代码:
barWidth-= barSpace; //or barWidth-=20;
这样,您将从每个栏中腾出一些空间谢谢。顺便说一句,你能告诉我valueQ和valueP的目的是什么吗?对不起,我指的是valueX和valueY。我从另一个名为P和Q的站点复制了相同的代码:P@SuperStar它们代表每个矩形条左上角的左上角和上角坐标。在当前代码中,最后一个矩形条部分隐藏。所以,我做了一个修改来克服这个问题。现在,我还有一些问题。那么,我能再问你一个问题吗?我想我会提出一个新问题。@SuperStar提示:试着只粘贴相关代码或创建一个新问题。或者至少突出显示有问题的代码行。谢谢。顺便说一句,你能告诉我valueQ和valueP的目的是什么吗?对不起,我指的是valueX和valueY。我从另一个名为P和Q的站点复制了相同的代码:P@SuperStar它们代表每个矩形条左上角的左上角和上角坐标。在当前代码中,最后一个矩形条部分隐藏。所以,我做了一个修改来克服这个问题。现在,我还有一些问题。那么,我能再问你一个问题吗?我想我会提出一个新问题。@SuperStar提示:试着只粘贴相关代码或创建一个新问题。或者至少突出显示有问题的代码行。