2013-07-24 39 views
0

我想獲取XYPlot的dataArea,但我放置它的圖表面板似乎不記錄它。每當我要求它時,我總是得到高度,寬度,x和y值爲0。ChartRenderingInfo返回0的圖表區域

private JPanel createChartPanel() 
    { 
    JPanel chartAreaPanel = new JPanel(); 
    JFreeChart originalDataChart = createOriginalDataChart(); 
    ChartPanel originalDataPanel = new ChartPanel(originalDataChart); 
    drawDataDirections(originalDataChart, originalDataPanel);  
    //This is where I need originalDataPanel's ChartRenderingInfo, 
    //but all of the relevant fields in it are zero. Why? 
    originalDataPanel.setPreferredSize(new Dimension(960, 500));   
    chartAreaPanel.setLayout(new GridBagLayout()); 
    chartAreaPanel.add(originalDataPanel); 

    JPanel centerPanel = new JPanel(); 

    JPanel chartPanel = new JPanel(new BorderLayout()); 
    Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED); 
    TitledBorder chartBorder = BorderFactory.createTitledBorder(etchedBorder, "Timeseries Chart"); 
    chartBorder.setTitlePosition(TitledBorder.TOP); 
    chartPanel.setBorder(chartBorder); 

    centerPanel.add(chartAreaPanel); 
    chartPanel.add(centerPanel, BorderLayout.EAST); 

    return chartPanel; 
    } 

下面是drawDataDirections()

private void drawDataDirections(JFreeChart jfc, ChartPanel cp) 
    { 
    XYPlot original = ((XYPlot) ((CombinedDomainXYPlot) jfc.getXYPlot()).getSubplots().get(0)); 
    XYDataset data = original.getDataset(0); 
    Rectangle2D dataArea = cp.getChartRenderingInfo().getPlotInfo().getDataArea(); 
    ValueAxis domAxis = original.getDomainAxis(); 
    ValueAxis rngAxis = original.getRangeAxis(); 

    float[] xCoords = new float[data.getItemCount(0)]; 
    float[] yCoords = new float[data.getItemCount(0)]; 
    double[] angles = new double[data.getItemCount(0)]; 

    //These three values need to be set in advance, as they are never reached. 
    xCoords[0] = (float) domAxis.valueToJava2D(data.getXValue(0, 0), dataArea, original.getDomainAxisEdge()); 
    yCoords[0] = (float) rngAxis.valueToJava2D(data.getYValue(0, 0), dataArea, original.getRangeAxisEdge()); 
    angles[angles.length - 1] = 0.0; 

    for (int i = 1;i < data.getItemCount(0);i++) 
     { 
     xCoords[i] = (float) domAxis.valueToJava2D(data.getXValue(0, i), dataArea, original.getDomainAxisEdge()); 
     yCoords[i] = (float) rngAxis.valueToJava2D(data.getYValue(0, i), dataArea, original.getRangeAxisEdge()); 
     angles[i] = Math.atan2(yCoords[i] - yCoords[i - 1], xCoords[i] - xCoords[i - 1]); 
     } 

    ((XYLineAndShapeRendererExtended) original.getRenderer(0)).setAngles(angles); 
    ((XYLineAndShapeRendererExtended) original.getRenderer(0)).setCoords(xCoords, yCoords); 
    //Finally, start drawing the shapes. 
    ((XYLineAndShapeRendererExtended) original.getRenderer(0)).setSeriesShapesVisible(0,true); 
    } 

回答

1

你試圖訪問渲染信息之前圖表其實一直尺寸和渲染。值是未知的。例如,在這裏,我嘗試之前和框架已經擠滿並提出後訪問渲染信息可見:

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.category.DefaultCategoryDataset; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.geom.Rectangle2D; 

class Sandbox { 
    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     final DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
     dataset.addValue(1, "Test", "A"); 
     dataset.addValue(4, "Test", "B"); 
     dataset.addValue(3, "Test", "C"); 

     final JFreeChart chart = ChartFactory.createLineChart(
      "Test", "Domain", "Range", dataset, 
      PlotOrientation.VERTICAL, true, true, false); 

     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout(5, 5)); 
     final ChartPanel cp = new ChartPanel(chart); 
     frame.add(cp, BorderLayout.CENTER); 

     Rectangle2D dataArea = cp.getChartRenderingInfo().getPlotInfo().getDataArea(); 
     System.out.println("dataArea = " + dataArea); 

     frame.setLocationRelativeTo(null); 
     frame.pack(); 
     frame.setVisible(true); 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
      Rectangle2D dataArea = cp.getChartRenderingInfo().getPlotInfo().getDataArea(); 
      System.out.println("dataArea = " + dataArea); 
      } 
     }); 
     } 
    }); 
    } 
} 

輸出:

dataArea = java.awt.geom.Rectangle2D$Double[x=0.0,y=0.0,w=0.0,h=0.0] 
dataArea = java.awt.geom.Rectangle2D$Double[x=67.8984375,y=34.140625,w=600.1015625,h=307.9921875] 
+0

好了,所以你建議我打電話drawDataDirections ()在圖表變爲可見之後。我會嘗試的。 – Inglonias

+1

優秀的答案。這個修復對我來說效果很好。 – Inglonias