3

私のデータ値は 0 から 100 の間で変動する可能性があります。0 ~ 30 の範囲を示す JFreeChart DialPlot を表示したいと思います。30 より大きい値は、針を 30 に固定することで表示されますが、実際の値はダイヤルに表示されます。

以下の画像は、私のコード例が現在生成しているものを示しています。

電流出力

ダイヤル例

ここでは、値 50 を表示しています。ダイヤルは、14 を指すように一周しています。燃料ダイヤルと同じように、最大​​値 (30) に設定することをお勧めします。

望ましい出力

ここに画像の説明を入力

これは JFreeChart で可能ですか? 以下のSSCCEコード。

public class DemoChartProblem {

  private final DefaultValueDataset dataset = new DefaultValueDataset(50);
  private final JFrame frame = new JFrame();

  public static void main(String[] args) throws Exception {
    new DemoChartProblem();
  }

  public DemoChartProblem() {
    frame.setPreferredSize(new Dimension(300, 300));
    frame.add(buildDialPlot(0, 30, 5));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        frame.setVisible(true);
      }
    });
  }

  private ChartPanel buildDialPlot(int minimumValue, int maximumValue,
      int majorTickGap) {

    DialPlot plot = new DialPlot(dataset);
    plot.setDialFrame(new StandardDialFrame());
    plot.addLayer(new DialValueIndicator(0));
    plot.addLayer(new DialPointer.Pointer());

    StandardDialScale scale = new StandardDialScale(minimumValue, maximumValue,
        -120, -300, majorTickGap, majorTickGap - 1);
    scale.setTickRadius(0.88);
    scale.setTickLabelOffset(0.20);
    plot.addScale(0, scale);

    return new ChartPanel(new JFreeChart(plot));
  }
}
4

2 に答える 2

4

より良い方法があれば聞いてみたいです。

DialValueIndicatorとの不一致はmaximumValue混乱を招く可能性があります。別の方法として、次を使用して個別の範囲を示しますStandardDialRange

int redLine = 3 * maximumValue / 5;
plot.addLayer(new StandardDialRange(minimumValue, redLine, Color.blue));
plot.addLayer(new StandardDialRange(redLine, maximumValue, Color.red));

フレームの優先サイズの設定には問題があります。代わりに、次のgetPreferredSize()メソッドをオーバーライドしChartPanelます。

return new ChartPanel(new JFreeChart(plot)) {
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 300);
    }
};

テスト画像

于 2013-04-24T01:43:40.220 に答える
1

回避策の答えを見つけたばかりですが、より良い方法があるかどうかを知りたいです。

このソリューションでは、2 つのDefaultValueDatasetオブジェクトを維持します。1 つは実際の値を含み、もう 1 つは制約された値を含み、私のダイヤル制限を超えません。針は制約セットに関連付けられ、ダイヤル値は実際の値にリンクされます。

public class DemoChartProblem {

  private static final int DISPLAY_MAX = 30;
  private final DefaultValueDataset dataset = new DefaultValueDataset();
  private final DefaultValueDataset displayDataset = new DefaultValueDataset();
  private final JFrame frame = new JFrame();

  public static void main(String[] args) throws Exception {
    new DemoChartProblem();
  }

  public DemoChartProblem() {
    frame.setPreferredSize(new Dimension(300, 300));
    frame.add(buildDialPlot(0, DISPLAY_MAX, 5));
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    setValue(50);

    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        frame.setVisible(true);
      }
    });
  }

  private void setValue(int value) {
    dataset.setValue(value);
    displayDataset.setValue(Math.min(DISPLAY_MAX, value));
  }

  private ChartPanel buildDialPlot(int minimumValue, int maximumValue,
      int majorTickGap) {

    DialPlot plot = new DialPlot();
    plot.setDataset(0, dataset);
    plot.setDataset(1, displayDataset);

    plot.setDialFrame(new StandardDialFrame());

    // value indicator uses the real data set
    plot.addLayer(new DialValueIndicator(0));

    // needle uses constrained data set
    plot.addLayer(new DialPointer.Pointer(1));

    StandardDialScale scale = new StandardDialScale(minimumValue, maximumValue,
        -120, -300, majorTickGap, majorTickGap - 1);
    scale.setTickRadius(0.88);
    scale.setTickLabelOffset(0.20);
    plot.addScale(0, scale);

    return new ChartPanel(new JFreeChart(plot));
  }
}
于 2013-04-23T08:09:54.820 に答える