问题
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
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 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