我使用JFreeChart的API,使一個應用程序,使得在滑動件的運動中之間的兩個杆的間隙寬度被根據的的值增加或減少,以確定在StackedBarChart爲ItemMargin屬性min和max值滑塊。但是,我發現用不同的圖表和不同的數據項保證金屬性會變化。 爲了演示這個問題,我附上了以下代碼: - 如何使用的JFreeChart
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.LegendItemCollection;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.SubCategoryAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.GroupedStackedBarRenderer;
import org.jfree.data.KeyToGroupMap;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class DomainTranslateDemo extends ApplicationFrame {
private static class DemoPanel extends JPanel implements ChangeListener {
private static int SLIDER_INITIAL_VALUE = 50;
private JSlider slider;
private DateAxis domainAxis;
private int lastValue = SLIDER_INITIAL_VALUE;
private GroupedStackedBarRenderer renderer;
// one month (milliseconds, seconds, minutes, hours, days)
private int delta = 1000 * 60 * 60 * 24 * 30;
public DemoPanel() {
super(new BorderLayout());
final CategoryDataset dataset = createDataset();
final JFreeChart chart = createChart(dataset);
final ChartPanel chartPanel = new ChartPanel(chart);
Dimension Dim = new Dimension(590, 350);
chartPanel.setPreferredSize(Dim);
add(chartPanel);
JPanel dashboard = new JPanel(new BorderLayout());
dashboard.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));
this.slider = new JSlider(0, 100, SLIDER_INITIAL_VALUE);
this.slider.addChangeListener(this);
dashboard.add(this.slider);
add(dashboard, BorderLayout.SOUTH);
}
private CategoryDataset createDataset() {
DefaultCategoryDataset result = new DefaultCategoryDataset();
result.addValue(1.5, "5YEUR", "5Y");
result.addValue(-1.5, "5YUSD", "5Y");
result.addValue(0.5, "5Yx5YEUR", "5Yx5Y");
result.addValue(-0.5, "5Yx5YUSD", "5Yx5Y");
result.addValue(1.5, "10Yx5YEUR", "10Yx5Y");
result.addValue(-1.5, "10Yx5YUSD", "10Yx5Y");
result.addValue(1.5, "15Yx5YEUR", "15Yx5Y");
result.addValue(-1.5, "15Yx5YUSD", "15Yx5Y");
result.addValue(1.5, "20Yx5YEUR", "20Yx5Y");
result.addValue(-1.5, "20Yx5YUSD", "20Yx5Y");
result.addValue(1.5, "20Yx5YEUR", "25Yx5Y");
result.addValue(-1.5, "20Yx5YUSD", "25Yx5Y");
//result.addValue(11.9, "Product 3 (US)", "Jan 04");
return result;
}
private JFreeChart createChart(final CategoryDataset dataset) {
final JFreeChart chart = ChartFactory.createStackedBarChart(
"Max Bar Width", // chart title
"Category", // domain axis label
"Value", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // the plot orientation
true, // legend
true, // tooltips
false // urls
);
renderer = new GroupedStackedBarRenderer();
KeyToGroupMap map = new KeyToGroupMap("G1");
map.mapKeyToGroup("5YEUR", "G1");
map.mapKeyToGroup("5YUSD", "G1");
map.mapKeyToGroup("5Yx5YEUR", "G2");
map.mapKeyToGroup("5Yx5YUSD", "G2");
map.mapKeyToGroup("10Yx5YEUR", "G3");
map.mapKeyToGroup("10Yx5YUSD", "G3");
map.mapKeyToGroup("15Yx5YEUR", "G4");
map.mapKeyToGroup("15Yx5YUSD", "G4");
map.mapKeyToGroup("20Yx5YEUR", "G5");
map.mapKeyToGroup("20Yx5YUSD", "G5");
map.mapKeyToGroup("25Yx5YEUR", "G6");
map.mapKeyToGroup("25Yx5YUSD", "G6");
renderer.setSeriesToGroupMap(map);
double maxBarWidth = renderer.getMaximumBarWidth();
//renderer.setMaximumBarWidth(1);
renderer.setItemMargin(-20);
/* SubCategoryAxis domainAxis = new SubCategoryAxis("Product/Month");
domainAxis.setCategoryMargin(0.05);
domainAxis.addSubCategory("Product 1");
domainAxis.addSubCategory("Product 2");
domainAxis.addSubCategory("Product 3");*/
CategoryPlot plot = (CategoryPlot) chart.getPlot();
//plot.setDomainAxis(domainAxis);
plot.setRenderer(renderer);
plot.setFixedLegendItems(createLegendItems());
return chart;
}
/**
* @return The legend items.
*/
private LegendItemCollection createLegendItems() {
LegendItemCollection result = new LegendItemCollection();
return result;
}
@Override
public void stateChanged(ChangeEvent event) {
int value = this.slider.getValue();
/* long minimum = domainAxis.getMinimumDate().getTime();
long maximum = domainAxis.getMaximumDate().getTime();
if (value<lastValue) { // left
minimum = minimum - delta;
maximum = maximum - delta;
} else { // right
minimum = minimum + delta;
maximum = maximum + delta;
}
DateRange range = new DateRange(minimum,maximum);
domainAxis.setRange(range);*/
System.out.println("value:"+value);
renderer.setItemMargin(value/100.0);
}
}
public DomainTranslateDemo(String title) {
super(title);
setContentPane(new DemoPanel());
}
public static JPanel createDemoPanel() {
return new DemoPanel();
}
public static void main(String[] args) {
DomainTranslateDemo demo = new DomainTranslateDemo("Translate Demo");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}
從上面的代碼很明顯,兩條不相互接觸, 滑塊值= 0。類似地,在100%之前,我的酒吧消失了。 我需要一個應用程序在上滑塊的分鐘值
=所有的酒吧需要觸摸彼此
上滑塊的最大值=它將顯示在條之間最大距離。
這將取決於物品保證金屬性的最大值和最小值。 我搜索了幾個與此相關的文檔沒有找到任何有說服力的計算。
這方面的任何建議都會非常有幫助。
感謝
1爲[SSCCE](http://sscce.org/)。 – trashgod