Hamza Shahid Hamza Shahid - 3 months ago 13
Java Question

My JFrame is not showing output of the dial

This is my

DialPlot
class:

public class Demo {

private DefaultValueDataset dataset = new DefaultValueDataset(0);

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

DialPlot plot = new DialPlot(dataset);
plot.setDialFrame(new StandardDialFrame());
plot.addLayer(new DialValueIndicator(0));
plot.addLayer(new DialPointer.Pointer());
int redLine =maximumValue / 5 + 10;
plot.addLayer(new StandardDialRange(maximumValue, redLine, Color.blue));
plot.addLayer(new StandardDialRange(redLine, minimumValue, Color.red));

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

return new ChartPanel(new JFreeChart(plot)) {

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


This is my
JFrame
GUI class

public class NewJFrame extends javax.swing.JFrame {
Demo d=new Demo();
int minimumValue=0;
int maximumValue=100;
int majorTickGap=1;

public NewJFrame() {
initComponents();
d.buildDialPlot(minimumValue,maximumValue,majorTickGap);
this.pack();
this.setLocationRelativeTo(null);
}


I also added it in
JFrame
GUI class like this:

this.add(d.buildDialPlot(minimumValue,maximumValue,majorTickGap));


It shows the same result empty
JFrame
.
Anyone knows what's my mistake?

The image below shows what my example code currently produces

Answer

Art a minimum, you need to add() the ChartPanel returned by buildDialPlot() to the JFrame. A complete example is shown here.

public NewJFrame() {
    initComponents();
    ChartPanel cp = d.buildDialPlot(minimumValue, maximumValue, majorTickGap);
    this.add(cp);
    this.pack();
    this.setLocationRelativeTo(null);
}

Addendum: Using the approach suggested here, the example below adds your Demo to a locally declared JFrame.

image

As tested:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
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.StandardDialRange;
import org.jfree.chart.plot.dial.StandardDialScale;
import org.jfree.data.general.DefaultValueDataset;

/**
 * @see http://stackoverflow.com/a/38906326/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Demo d = new Demo();
        ChartPanel cp = d.buildDialPlot(0, 100, 10);
        f.add(cp);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static class Demo {

        private DefaultValueDataset dataset = new DefaultValueDataset(0);

        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());
            int redLine = maximumValue / 5 + 10;
            plot.addLayer(new StandardDialRange(maximumValue, redLine, Color.blue));
            plot.addLayer(new StandardDialRange(redLine, minimumValue, Color.red));

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

            return new ChartPanel(new JFreeChart(plot)) {

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

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}