2012-12-21 47 views
0

我有兩個JFreeChart問題。應用程序窗口正在關注並調整大小

我使用的是線XYLineChart和更新數據集,使其定期刷新的數據,並添加更多的項目。問題是,當我添加更多數據時,應用程序窗口會直接返回前臺,因此如果我在另一個窗口中輸入該窗口失去焦點時。

我遇到的第二個問題是,每次圖形更新時,都會調整自身大小,因此無法調整大小並保持它。

請有人可以幫助解決這個問題?感謝

public static void main (String[] args){ 
      String val= args[0]; 
      LineChart chart = new LineChart("Name " + val); 

      while(true){ 
      Main main = new Main(); 
      XMLData data = getMyData()   
      chart.addToDataSet(data); 
      chart.pack(); 
       RefineryUtilities.centerFrameOnScreen(chart); 
       chart.setVisible(true); 
       LineChart.incremementxAxisTimePlot(true); 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      } 



package com.chart.graph; 


import java.awt.Color; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.ApplicationFrame; 
import com.graph.logfiledata.XMLData; 


/** 
* A simple demonstration application showing how to create a line chart using data from an 
* {@link XYDataset}. 
* 
*/ 
public class LineChart extends ApplicationFrame { 

    private static int xAxisTimePlot = 5; 
    private XYSeriesCollection dataset = new XYSeriesCollection(); 

    public LineChart(final String title) { 

     super(title); 
     final JFreeChart chart = createChart(dataset); 
     final ChartPanel chartPanel = new ChartPanel(chart); 
     chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); 
     setContentPane(chartPanel); 

     dataset.addSeries(series2); 
     dataset.addSeries(series3); 
     dataset.addSeries(series4); 
     dataset.addSeries(series5); 
     dataset.addSeries(series6); 
     dataset.addSeries(series7); 
     dataset.addSeries(series8); 
     dataset.addSeries(series9); 
     dataset.addSeries(series10); 


    } 

    public static void incremementxAxisTimePlot(boolean update){ 
     if(update){ 
      xAxisTimePlot+=5; 
     } 
    } 
    XYSeries series2 = new XYSeries("1"); 
    XYSeries series3 = new XYSeries("2"); 
    XYSeries series4 = new XYSeries("3"); 
    XYSeries series5 = new XYSeries("4"); 
    XYSeries series6 = new XYSeries("5"); 
    XYSeries series7 = new XYSeries("6"); 
    XYSeries series8 = new XYSeries("7"); 
    XYSeries series9 = new XYSeries("8"); 
    XYSeries series10 = new XYSeries("9"); 
    public void addToDataSet(XMLData data){ 

     series2.add(xAxisTimePlot, data.getOne()); 
     series3.add(xAxisTimePlot, data.getTwo()); 
     series4.add(xAxisTimePlot, data.getThree()); 
     ...   

    } 

    /** 
    * Creates a chart. 
    * 
    * @param dataset the data for the chart. 
    * 
    * @return a chart. 
    */ 
    private JFreeChart createChart(final XYDataset dataset) { 

     // create the chart... 
     final JFreeChart chart = ChartFactory.createXYLineChart("Line Chart","X","Y", dataset, PlotOrientation.VERTICAL,true,true, false); 
     chart.setBackgroundPaint(Color.white); 

     // get a reference to the plot for further customisation... 
     final XYPlot plot = chart.getXYPlot(); 
     plot.setBackgroundPaint(Color.lightGray); 
     plot.setDomainGridlinePaint(Color.white); 
     plot.setRangeGridlinePaint(Color.white); 

     final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(); 
     renderer.setSeriesLinesVisible(0, false); 
     renderer.setSeriesShapesVisible(1, false); 
     plot.setRenderer(renderer); 

     // change the auto tick unit selection to integer units only... 
     final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
     rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 

     return chart; 
    } 
} 

回答

3
  • while(true){是5秒期間

  • 尤其無端環無端環withouth的break;所有Objects創建(內部while(true){),創建一堆一個新的GUI的

含義代碼

Main main = new Main(); 
XMLData data = getMyData()   
chart.addToDataSet(data); 
chart.pack(); 
  • 之前準備GUI,那麼如果是有真正的原因來創建循環,但定義的while(true){break;

  • 爲什麼原因布爾變量instread while(canRun){Thread.sleep(5000);,在的情況下使用Swing Timer該圖形用戶界面基於Swing/AWT container,

  • 如果是基於Swing/AWT的容器,那麼你有Concurency in Swing問題,其中所有事件都必須在EventDispatchTread完成,

  • 你的GUI永遠不會被刷新,直到(無盡)循環結束了,因爲Thread.sleep(5000);造成的Swing GUI的filckering的凍結,造成鎖定EventDispatchTread

+0

這裏有一個[示例](HTTP: //stackoverflow.com/a/13205322/230513)更新來自'SwingWorker'的圖表模型 – trashgod