我的项目中最后一件事需要帮助。我需要将JDialog中的4个变量(名为a,b,c和d)传递给另一个类中的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
所以实际上并不是解析会让事情变得糟糕,要么它真的很简单而且我只是错过了一点或者它是不可能的......
答案 0 :(得分:2)
你错过了这一点。问题是您在OknoFunkcji
到PanelFunkcji
中有引用。
在这里,您要创建一个新实例,并且您不希望拥有此JPanel的新实例。此外,您不会将其添加到任何容器中。
panelFunkcji = new PanelFunkcji(new JFrame());
此课程PanelFunkcji
使用 OknoFunkcji
,而不是反之亦然。因此,当您创建OknoFunkcji
的新实例时,您必须通过构造函数注入或setter注入传递该值。例如,你可以这样做。
@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.createChart(dA,dB,dC,dD); // added this method
oknoFunkcji.setVisible(true);
//setVisible(false);
}
else if (z == bCancel) {
setVisible(false);
}
}
在你的另一个班级
public OknoFunkcji(String title) {
super(title);
System.out.println("3rd checkpoint: A " + a + " B " + b + " C " + c + " D " + d);
}
public void createChart(double dA, double dB, double dC, double dD) {
setData(dA,dB,dC,dD);
JPanel chartPanel = createDemoPanel();
chartPanel.setSize(500, 270);
setContentPane(chartPanel);
revalidate();
repaint();
}
public void setData(double dA, double dB, double dC, double dD) {
a = dA;
b = dB;
c = dC;
d = dD;
System.out.println("2nd checkpoint: A " + a + " B " + b + " C " + c + " D " + d);
}
作为附注并且并不重要,你不应该使你的变量和你的所有方法static
因为没有实际的理由来创建该类的实例。
请勿使用null layout
了解如何使用Layout Manager。