5

パイプに沿った圧力を表す配列の時刻歴があります。したがって、各デルタ t のパイプの長さに沿った圧力値の配列があります。JFreeChart を使用してパイプの長さに沿って圧力をプロットし、スライダーでプロットするデルタ t を選択して、ユーザーがスライダーを移動するたびにグラフィックが別のデルタ t の値で更新されるようにします。また、パイプの最後の部分で圧力になるようにタイルをリセットしています。タイトルが更新されているということは、データが適切に更新されていることを意味しますが、曲線は同じままです。フォーラムで考えられるすべてのトピックを読み、思いつく限りのことを試しましたが、うまくいきません! JPanel を拡張するクラスのコードを次に示します。このコードでは、jSlider1StateChanged メソッドがスライダー位置の変化を認識します。

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;
  }
}

データセットを変更すると、グラフ自体が再描画されると思いました。コードが大きすぎて投稿できない場合は申し訳ありませんが、多かれ少なかれ明確にするためにどの部分を貼り付ける必要があるか正確にはわかりません.

4

1 に答える 1

6

完全な例がなくても、ここに示すアプローチを使用できる場合があります。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();
            }
        });
    }
}
于 2013-03-04T17:31:54.507 に答える