2014-01-21 197 views
1

我正在試圖添加函數繪圖到我的Java Swing應用程序。在我的主應用程序窗口中,我想用一個簡單的JLabel =「f(x)=」和一個JTextField來啓動一個JDialog,在這裏用戶需要輸入自己想要繪製的函數。JFreeChart 2D函數繪製用戶定義的自定義函數

我想適應包含演示示例,以便我可以將文本從JTextField重定向到這個類,但我確實被卡住了 - 沒有想法如何做到這一點。

下面是顯示圖中的類代碼:

class OknoFunkcji extends ApplicationFrame { 



public OknoFunkcji(String title) { 
    super(title); 
    JPanel chartPanel = createDemoPanel(); 
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); 
    setContentPane(chartPanel); 
} 

/** 
* Creates a chart. 
* 
* @param dataset 
* 
* @return returns chart instance 
*/ 
private static JFreeChart createChart(XYDataset dataset) { 
    // create the chart... 
    JFreeChart chart = ChartFactory.createXYLineChart(
     "OknoFunkcji ",  // 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 x * x + 2; 
    } 

} 


} 

我怎樣才能改變getValue方法,因此使用用戶定義的函數?這裏是我的JDialog代碼:

class PanelFunkcji extends JDialog implements ActionListener { 
private JLabel lFunkcja; 
private JTextField tFunkcja; 
private JButton bOK, bCancel; 

public PanelFunkcji(JFrame owner) { 
    super(owner, "Wprowadzanie funkcji", true); 
    setSize(250,120); 
    setLayout(null); 

    lFunkcja = new JLabel("f(x) = "); 
    lFunkcja.setBounds(10, 10, 100, 20); 
    add(lFunkcja); 

    tFunkcja = new JTextField(); 
    tFunkcja.setBounds(40, 10, 180, 20); 
    add(tFunkcja); 

    bOK = new JButton("OK"); 
    bOK.setBounds(10, 40, 100, 20); 
    add(bOK); 
    bOK.addActionListener(this); 

    bCancel = new JButton("Anuluj"); 
    bCancel.setBounds(120, 40, 100, 20); 
    add(bCancel); 
    bCancel.addActionListener(this); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    Object z = e.getSource(); 
    if(z == bOK) { 
     //TO-DO: Send the function from tFunkcja to the plotter 
     setVisible(false); 
    } 
    else if (z == bCancel) { 
     setVisible(false);   
    } 

} 



} 

對不起,對於波蘭語中的一些字符串或評論,希望它對你來說不是什麼大問題。 我真的很感激任何幫助,因爲我需要它像昨天一樣,我真的沒有時間像往常一樣學習它。

+0

Heh powodzenia;) –

+1

使用'ScriptEngine',見[這裏](http://stackoverflow.com/a/7441804/230513)。 – trashgod

+0

你能指導我,我應該怎麼做呢? – Asunez

回答

1

在執行Function2D時,將字符s中的變量x替換爲Double.valueOf(x)來表示您選擇的函數。如here所示,從可用的ScriptEngine調用eval(s)。返回結果的double值。