JFreeChart MeterPlot [英] JFreeChart MeterPlot

查看:45
本文介绍了JFreeChart MeterPlot的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在用Java执行Agent项目.在某些时候,我需要显示一个仪表,例如:电池电量.我的程序中有5个代理,每个代理都创建了自己的仪表图,上面有名称,但是不知何故他们没有更新数据集.或者他们正在更新数据集,只是它没有显示在仪表图上.有什么主意吗?

I'm currently doing Agent project in java. At some point I need to show a meter for eg: battery level. I've got 5 agents in my program, each agent creates it's own meter plot with name on it, but somehow they are not updating the dataset. OR they are updating the dataset just that it isnt show on the meterplot. Any idea ?

以下是我的代码: car.java

{
    private CarMeter meter;
    meter = new CarMeter(getLocalName());
    meter.update(currentBatteryCharge);
}

meterplot.java

meterplot.java

public class CarMeter extends ApplicationFrame {

 private static DefaultValueDataset dataset1;

public CarMeter(String s) {
    super(s);
    JPanel panel = createPanel();
    panel.setPreferredSize(new Dimension(500, 350));
    setContentPane(panel);
    pack();
    setVisible(true);
}

public CarMeter() {
    super("s");
    JPanel panel = createPanel();
    panel.setPreferredSize(new Dimension(500, 350));
    setContentPane(panel);
    pack();
    setVisible(true);
}

private static JFreeChart createChart(ValueDataset valuedataset) {
    MeterPlot meterplot = new MeterPlot(valuedataset);
  //set minimum and maximum value
    meterplot.setRange(new Range(0.0D, 100000D));

    meterplot.addInterval(new MeterInterval("Battery LOW", new Range(0.0D, 10000D), 
            Color.red, new BasicStroke(2.0F), new Color(255, 0, 0, 128)));

    meterplot.addInterval(new MeterInterval("Moderate", new Range(10001D, 90000D), 
            Color.yellow, new BasicStroke(2.0F), new Color(255, 255, 0, 64)));

    meterplot.addInterval(new MeterInterval("Battery FULL", new Range(90001D, 100000D),
            Color.green, new BasicStroke(2.0F), new Color(0, 255, 0, 64)));

    meterplot.setNeedlePaint(Color.darkGray);
    meterplot.setDialBackgroundPaint(Color.white);
    meterplot.setDialOutlinePaint(Color.black);
    meterplot.setDialShape(DialShape.CHORD);
    meterplot.setMeterAngle(180);
    meterplot.setTickLabelsVisible(true);
    meterplot.setTickLabelFont(new Font("Arial", 1, 12));
    meterplot.setTickLabelPaint(Color.black);
    meterplot.setTickSize(5D);
    meterplot.setTickPaint(Color.gray);
    meterplot.setValuePaint(Color.black);
    meterplot.setValueFont(new Font("Arial", 1, 14));
    JFreeChart jfreechart = new JFreeChart("Battery Level",
            JFreeChart.DEFAULT_TITLE_FONT, meterplot, true);
    return jfreechart;
}

public static JPanel createPanel() {
    dataset1 = new DefaultValueDataset(0);
    JFreeChart chart = createChart(dataset1);
    ChartPanel chartpanel = new ChartPanel(chart);
    return chartpanel;
}

public void update(int data){
dataset1.setValue(data);
System.out.println(""+dataset1 +" " +data);
}

推荐答案

如@ alex2410所述,您的代码如下所示.如@Outlaw引用的 answer 中所述,图(视图)侦听数据集(模型).一些注意事项,

As noted by @alex2410, your code works as shown below. As noted in an answer cited by @Outlaw, the plot (view) listens to the dataset (model). Some notes,

  • 不要在构造函数中重复代码;让一个调用另一个.

  • Don't repeat code in constructors; let one invoke another.

当您真的要覆盖 getPreferredSize() 时,请勿使用setPreferredSize().

不要使用静态成员在可重用的视图类中引用模型.

Don't use a static member to reference the model in a reusable view class.

不要在构造函数中调用公共方法.

Don't invoke public methods in constructors.

请使用连续范围以避免标签中出现视觉伪像.

Do use contiguous ranges to avoid visual artifact in labels.

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.DialShape;
import org.jfree.chart.plot.MeterInterval;
import org.jfree.chart.plot.MeterPlot;
import org.jfree.data.Range;
import org.jfree.data.general.DefaultValueDataset;
import org.jfree.data.general.ValueDataset;
import org.jfree.ui.ApplicationFrame;

public class CarMeter extends ApplicationFrame {

    private DefaultValueDataset dataset;
    private int value = 50000;

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

    public CarMeter(String s) {
        super(s);
        JPanel panel = createPanel();
        setContentPane(panel);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        Timer t = new Timer(250, new ActionListener() {
            Random r = new Random();

            @Override
            public void actionPerformed(ActionEvent e) {
                value -= (int) (Math.abs(100 * r.nextGaussian()));
                update(value);
            }
        });
        t.start();
    }

    public CarMeter() {
        this("Test");
    }

    private JFreeChart createChart(ValueDataset valuedataset) {
        MeterPlot meterplot = new MeterPlot(valuedataset);
        meterplot.setRange(new Range(0.0D, 100000D));
        meterplot.addInterval(new MeterInterval("Battery LOW", new Range(0.0D, 10000D),
            Color.red, new BasicStroke(2.0F), new Color(255, 0, 0, 128)));
        meterplot.addInterval(new MeterInterval("Moderate", new Range(10000D, 90000D),
            Color.yellow, new BasicStroke(2.0F), new Color(255, 255, 0, 64)));
        meterplot.addInterval(new MeterInterval("Battery FULL", new Range(90000D, 100000D),
            Color.green, new BasicStroke(2.0F), new Color(0, 255, 0, 64)));

        meterplot.setNeedlePaint(Color.darkGray);
        meterplot.setDialBackgroundPaint(Color.white);
        meterplot.setDialOutlinePaint(Color.black);
        meterplot.setDialShape(DialShape.CHORD);
        meterplot.setMeterAngle(180);
        meterplot.setTickLabelsVisible(true);
        meterplot.setTickLabelFont(new Font("Arial", 1, 14));
        meterplot.setTickLabelPaint(Color.black);
        meterplot.setTickSize(5D);
        meterplot.setTickPaint(Color.gray);
        meterplot.setValuePaint(Color.black);
        meterplot.setValueFont(new Font("Arial", 1, 14));
        JFreeChart jfreechart = new JFreeChart("Battery Level",
            JFreeChart.DEFAULT_TITLE_FONT, meterplot, true);
        return jfreechart;
    }

    private JPanel createPanel() {
        dataset = new DefaultValueDataset(value);
        JFreeChart chart = createChart(dataset);
        ChartPanel chartpanel = new ChartPanel(chart) {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 480);
            }
        };
        return chartpanel;
    }

    public void update(int data) {
        dataset.setValue(data);

    }
}

这篇关于JFreeChart MeterPlot的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆