2

I'm trying to make a dial from JFreeChart work while I press a JButton made in NetBeans. The problem is that although the code seems ok while outside the JButton, it gives me errors in the program when I put it inside.

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here
}

public class DemoChartProblem {

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

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

I guess it's something obvious, but I dont seem to find the problem; any help is appreciated.

trashgod
  • 203,806
  • 29
  • 246
  • 1,045
ZLT
  • 33
  • 3

1 Answers1

2

Several issues merit attention in your example:

  • Use Action to encapsulate functionality; this example increments the dataset value with each invocation.

    frame.add(new JButton(new AbstractAction("Update") {
    
        @Override
        public void actionPerformed(ActionEvent e) {
            dataset.setValue(dataset.getValue().intValue() + 1);
        }
    }), BorderLayout.SOUTH);
    
  • The main() method must be static.

  • Swing GUI objects should be constructed and manipulated only on the event dispatch thread.

  • Consider these alternate ways to control the initial chart size.

image

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.dial.DialPlot;
import org.jfree.chart.plot.dial.DialPointer;
import org.jfree.chart.plot.dial.DialValueIndicator;
import org.jfree.chart.plot.dial.StandardDialFrame;
import org.jfree.chart.plot.dial.StandardDialScale;
import org.jfree.data.general.DefaultValueDataset;

public class DemoChartProblem {

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

    public static void main(String[] args) throws Exception {
        EventQueue.invokeLater(() -> {
            new DemoChartProblem();
        });
    }

    public DemoChartProblem() {
        frame.add(buildDialPlot(0, 30, 5));
        frame.add(new JButton(new AbstractAction("Update") {

            @Override
            public void actionPerformed(ActionEvent e) {
                dataset.setValue(dataset.getValue().intValue() + 1);
            }
        }), BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        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)) {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };
    }
}
Community
  • 1
  • 1
trashgod
  • 203,806
  • 29
  • 246
  • 1,045