2013-06-27 34 views
1

我使用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%之前,我的酒吧消失了。 我需要一個應用程序在上滑塊的分鐘值

=所有的酒吧需要觸摸彼此

上滑塊的最大值=它將顯示在條之間最大距離。

這將取決於物品保證金屬性的最大值和最小值。 我搜索了幾個與此相關的文檔沒有找到任何有說服力的計算。

這方面的任何建議都會非常有幫助。

感謝

+0

1爲[SSCCE](http://sscce.org/)。 – trashgod

回答

1

我想你只需要使用更多的負範圍,例如中-50, 10

image

SSCCE:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.BorderFactory; 
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.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; 

/** @see http://stackoverflow.com/a/17342522/230513 */ 
public class DomainTranslateDemo extends ApplicationFrame { 

    private static class DemoPanel extends JPanel implements ChangeListener { 

     private static int SLIDER_INITIAL_VALUE = -42; 
     private static final double INCREMENT = 1/10.0; 
     private JSlider slider; 
     private GroupedStackedBarRenderer renderer; 

     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(-50, 10, 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"); 
      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.setItemMargin(SLIDER_INITIAL_VALUE * INCREMENT); 

      CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
      plot.setRenderer(renderer); 
      plot.setFixedLegendItems(createLegendItems()); 
      return chart; 
     } 

     private LegendItemCollection createLegendItems() { 
      LegendItemCollection result = new LegendItemCollection(); 
      return result; 
     } 

     @Override 
     public void stateChanged(ChangeEvent event) { 
      int value = slider.getValue(); 
      System.out.println("value:" + value); 
      renderer.setItemMargin(value * INCREMENT); 
     } 
    } 

    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

使「42」變得很重要。 – trashgod

+0

它看起來不錯。經過一些調整後,我希望它能解決我的問題。但是如果有什麼可以知道確切的最小和最大物品邊距使滑塊的最小值和最大值不同。這也會很好。非常感謝。 – user1709952

+0

對不起,我的結果純粹是經驗性的;你可能想試試'chartPanel.setMouseWheelEnabled(true)'。效果是分配「未使用」的空間,所以它大部分時間都是(至少)一個像素。 – trashgod