2013-03-03 15 views
5

パイプ沿いの圧力を表す配列の時間履歴があります。だから私は各デルタtのパイプの長さに沿って一連の圧力値を持っています。私はJFreeChartでパイプの長さに沿って圧力をプロットし、どのデルタをスライダでプロットするかを選択し、スライダを動かすたびにグラフィックが異なるデルタtの値で更新されるようにします。また、パイプの最後の部分の圧力になるようにタイルをリセットします。何が起こるかは、タイトルが更新であり、データが適切に更新されていることを意味しますが、曲線は変わりません。私はフォーラムですべての可能なトピックを読んで、私が考えることができるすべてを試しましたが、うまくいきません!次に、JPanelを拡張したクラスのコードを示します。jSlider1StateChangedメソッドはスライダ位置の変更を受け取り、createChartはプログラムの開始時に新しいチャートを作成し、dataSetGen(int ndt)はスライダの位置に基づいてグラフの新しいデータセットを生成します:グラフをJFreeChartとスライダで更新する

public class MyMainPanel extends JPanel { 

    private JFreeChart jc; 
    private OutputPipe op; 
    private DefaultXYDataset ds; 
    private javax.swing.JFrame jFrame1; 
    private javax.swing.JSlider jSlider1; 
    private pipevisualizer.MyChartPanel pnlChartPanel;      

    private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {          
     int ndt = ((JSlider) evt. 
       getSource()). 
       getValue(); 
     System.out.println("Slider1: " + ((JSlider) evt. 
       getSource()). 
       getValue()); 

     dataSetGen(ndt); 
     int a = 0; 
     jc.fireChartChanged(); 
    }     

    private void dataSetGen(int ndt) { 
     ArrayList<OutputPipeDt> opDtArray = op.getOpLit(); 
     OutputPipeDt opDt = opDtArray.get(ndt); 

     double[] H = opDt.getH(); 
     double[] l = new double[H.length]; 
     double[] p = new double[H.length]; 
     double dX = op.getPipeLength()/H.length; 
     double slope = op.getPipeSlope(); 
     double el = op.getPipeUSElev(); 

     for (int i = 0; i < H.length; i++) { 
       l[i] = dX * i; 
       p[i] = el - dX * slope * i; 
     } 

     double[][] dataH = new double[2][H.length]; 
     dataH[0] = l; 
     dataH[1] = H; 

     double[][] dataP = new double[2][H.length]; 
     dataP[0] = l; 
     dataP[1] = p; 

     ds = new DefaultXYDataset(); 
     ds.addSeries("pipe head", dataH); 
     ds.addSeries("pipe profile", dataP); 

     jc.setTitle("H[end] = " + Double.toString(dataH[1][l.length - 1])); 
     jc.fireChartChanged(); 
    } 

    private JFreeChart createChart(OutputPipe op, int ndt) { 

     ArrayList<OutputPipeDt> opDtArray = op.getOpLit(); 
     OutputPipeDt opDt = opDtArray.get(ndt); 

     double[] H = opDt.getH(); 
     double[] l = new double[H.length]; 
     double[] p = new double[H.length]; 
     double dX = op.getPipeLength()/H.length; 
     double slope = op.getPipeSlope(); 
     double el = op.getPipeUSElev(); 

     for (int i = 0; i < H.length; i++) { 
       l[i] = dX * i; 
       p[i] = el - dX * slope * i; 
     } 

     double[][] dataH = new double[2][H.length]; 
     dataH[0] = l; 
     dataH[1] = H; 

     double[][] dataP = new double[2][H.length]; 
     dataP[0] = l; 
     dataP[1] = p; 

     DefaultXYDataset ds = new DefaultXYDataset(); 
     ds.addSeries("pipe head", dataH); 
     ds.addSeries("pipe profile", dataP); 


     JFreeChart chart = ChartFactory.createXYLineChart(
       "t = " + Double.toString(op.getOpLit().get(ndt).getT()), 
       // chart title 
       "X", 
       // x axis label 
       "Y", 
       // y axis label 
       ds, 
       // data 
       PlotOrientation.VERTICAL, 
       true, 
       // include legend 
       true, 
       // tooltips 
       false // urls 
       ); 

     return chart; 
    } 
} 

データセットを変更するとグラフが再描画されると考えました。 もしコードがポストに載っているのが大きければ、私は正確に分かりにくい部分を貼り付けなければならないのか分かりません。

+0

[sscce](http://sscce.org/)を含めるようにあなたの質問を編集してください。ガイダンスについては、[ダイヤルデモ](http://www.jfree.org/jfreechart/samples.html)を参照してください。私はこのためのGUIエディタを使用して_not_をお勧めしたいと思います。 – trashgod

+0

私は3つの主な方法を編集して保存しました。 GUIエディタを使わずに試したところ、同じ結果でした。私も最初からやり直そうとしましたが、まだカーブに何も起こりません:( – Bernardoct

+0

クロス投稿[ここ](http://www.jfree.org/forum/viewtopic.php?f=3&t=116429)。 – trashgod

答えて

6

完全な例がない場合は、hereというアプローチを使用することができます。各イベントの受信時にデータセットを置き換えるのにplot.setDataset()を使用します。

補足:時間に対する温度と長さを示すこの例では、始動が開始される場合があります。

ChartSliderTest

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
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.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 

/** 
* @see https://stackoverflow.com/a/15207445/230513 
*/ 
public class ChartSliderTest { 

    private static final int N = 25; 
    private static final double K = 273.15; 
    private static final Random random = new Random(); 

    private static XYDataset getDataset(int n) { 

     final XYSeries series = new XYSeries("Temp (K°)"); 
     double temperature; 
     for (int length = 0; length < N; length++) { 
      temperature = K + n * random.nextGaussian(); 
      series.add(length + 1, temperature); 
     } 
     return new XYSeriesCollection(series); 
    } 

    private static JFreeChart createChart(final XYDataset dataset) { 
     JFreeChart chart = ChartFactory.createXYLineChart(
      "ChartSliderTest", "Length (m)", "Temp (K°)", dataset, 
      PlotOrientation.VERTICAL, false, false, false); 
     return chart; 
    } 

    private static void display() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final List<XYDataset> list = new ArrayList<XYDataset>(); 
     for (int i = 0; i <= 10; i++) { 
      list.add(getDataset(i)); 
     } 
     JFreeChart chart = createChart(list.get(5)); 
     final XYPlot plot = (XYPlot) chart.getPlot(); 
     plot.getRangeAxis().setRangeAboutValue(K, K/5); 
     ChartPanel chartPanel = new ChartPanel(chart) { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(800, 400); 
      } 
     }; 
     f.add(chartPanel); 
     final JSlider slider = new JSlider(0, 10); 
     slider.addChangeListener(new ChangeListener() { 
      @Override 
      public void stateChanged(ChangeEvent e) { 
       plot.setDataset(list.get(slider.getValue())); 
      } 
     }); 
     Box p = new Box(BoxLayout.X_AXIS); 
     p.add(new JLabel("Time:")); 
     p.add(slider); 
     f.add(p, BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       display(); 
      } 
     }); 
    } 
} 
+0

ありがとうあなたはとてもそうです! – Bernardoct

+0

あなたは歓迎です。別のバリエーションを 'List 'のように追加しました。 – trashgod

+0

@trashgodこれを見てみるといいのかしらと思いました:http://stackoverflow.com/questions/20056614/timing-プロット問題付き - 複数グラフ - 高速 –

関連する問題