问题
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.
回答1:
Several issues merit attention in your example:
Use Action to encapsulate functionality; this example increments the
datasetvalue 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 bestatic.Swing GUI objects should be constructed and manipulated only on the event dispatch thread.
Consider these alternate ways to control the initial chart size.
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);
}
};
}
}
来源:https://stackoverflow.com/questions/30678969/jfreechart-dial-in-netbeans-jbutton