Java Swing将变量传递给JFreeChart类
我的项目最后一件事需要帮助。我需要在另一个类中将4个变量(名为a、b、c和d)从JDialog传递到JFreeChart。我添加了检查点,以查看它实际停止处理的位置,代码如下:
package calc.kalkulator;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
class PanelFunkcji extends JDialog implements ActionListener {
private JLabel lA, lB, lC, lD;
private JTextField tA, tB, tC, tD;
private JButton bOK, bCancel;
private OknoFunkcji oknoFunkcji;
public double dA, dB, dC, dD;
public PanelFunkcji(JFrame owner) {
super(owner, "Wprowadzanie funkcji", true);
setSize(300, 300);
setLayout(null);
bOK = new JButton("OK");
bOK.setBounds(10, 40, 130, 20);
add(bOK);
bOK.addActionListener(this);
bCancel = new JButton("Anuluj");
bCancel.setBounds(150, 40, 130, 20);
add(bCancel);
bCancel.addActionListener(this);
lA = new JLabel("A = ");
lA.setBounds(10, 70, 40, 20);
add(lA);
tA = new JTextField("0");
tA.setBounds(50, 70, 60, 20);
add(tA);
lB = new JLabel("B = ");
lB.setBounds(10, 100, 40, 20);
add(lB);
tB = new JTextField("0");
tB.setBounds(50, 100, 60, 20);
add(tB);
lC = new JLabel("C = ");
lC.setBounds(10, 130, 40, 20);
add(lC);
tC = new JTextField("0");
tC.setBounds(50, 130, 60, 20);
add(tC);
lD = new JLabel("D = ");
lD.setBounds(10, 160, 40, 20);
add(lD);
tD = new JTextField("0");
tD.setBounds(50, 160, 60, 20);
add(tD);
}
public double getA() {
return Double.parseDouble(tA.getText());
}
public double getB() {
return Double.parseDouble(tB.getText());
}
public double getC() {
return Double.parseDouble(tC.getText());
}
public double getD() {
return Double.parseDouble(tD.getText());
}
@Override
public void actionPerformed(ActionEvent e) {
Object z = e.getSource();
if(z == bOK) {
dA = getA();
dB = getB();
dC = getC();
dD = getD();
System.out.println("1st checkpoint: A " + dA + " B " + dB + " C " + dC + " D " + dD);
if (oknoFunkcji == null) {
oknoFunkcji = new OknoFunkcji("Wykres");
}
oknoFunkcji.setVisible(true);
//setVisible(false);
}
else if (z == bCancel) {
setVisible(false);
}
}
}
我试图将变量传递给的类是:
package calc.kalkulator;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.*;
class OknoFunkcji extends ApplicationFrame {
private static PanelFunkcji panelFunkcji;
private static double a;
private static double b;
private static double c;
private static double d;
public void getDane () {
a = panelFunkcji.dA;
b = panelFunkcji.dB;
c = panelFunkcji.dC;
d = panelFunkcji.dD;
System.out.println("2nd checkpoint: A " + a + " B " + b + " C " + c + " D " + d);
}
public OknoFunkcji(String title) {
super(title);
JPanel chartPanel = createDemoPanel();
panelFunkcji = new PanelFunkcji(new JFrame());
chartPanel.setSize(500, 270);
setContentPane(chartPanel);
getDane();
System.out.println("3rd checkpoint: A " + a + " B " + b + " C " + c + " D " + d);
}
/**
* Tworzy chart.
*
* @param dataset - zbiór danych.
*
* @return Zwraca instancję charta.
*/
private static JFreeChart createChart(XYDataset dataset) {
// create the chart...
JFreeChart chart = ChartFactory.createXYLineChart(
" ", // chart title
"X", // x axis label
"Y", // y axis label
dataset, // data
PlotOrientation.VERTICAL,
true, // include legend
true, // tooltips
false // urls
);
XYPlot plot = (XYPlot) chart.getPlot();
plot.getDomainAxis().setLowerMargin(0.0);
plot.getDomainAxis().setUpperMargin(0.0);
return chart;
}
/**
* Creates a sample dataset.
*
* @return A sample dataset.
*/
public static XYDataset createDataset() {
XYDataset result = DatasetUtilities.sampleFunction2D(new X2(),
-10.0, 10.0, 40, "f(x)");
return result;
}
public static JPanel createDemoPanel() {
JFreeChart chart = createChart(createDataset());
return new ChartPanel(chart);
}
static class X2 implements Function2D {
public double getValue(double x) {
return a*x*x*x + b*x*x + c*x + d;
}
}
}
我在控制台上看到的是:
1st checkpoint: A 1.0 B 2.0 C 3.0 D 4.0
2nd checkpoint: A 0.0 B 0.0 C 0.0 D 0.0
3rd checkpoint: A 0.0 B 0.0 C 0.0 D 0.0
所以,实际上并不是解析让事情变得糟糕,或者它非常简单,我只是错过了一点,或者它是不可能的
# 1 楼答案
你没有抓住重点。问题是
OknoFunkcji
中有一个对PanelFunkcji
的引用在这里,您正在创建一个新实例,并且您不想拥有这个JPanel的新实例。此外,你不能把它添加到任何容器中
这个类
PanelFunkcji
使用OknoFunkcji
,而不是相反。因此,当您创建OknoFunkcji
的新实例时,必须通过构造函数注入或setter注入传递该值。例如,你可以这样做在你的另一节课上
作为旁注,同样重要的是,你不应该让你的变量和所有方法
static
因为没有实际的理由来创建这个类的实例。 不要使用null layout
了解如何使用Layout Manager