如何使用 JavaGD 在我的 JFrame 中可视化我的 R 图?

How to visualize my R plot in my JFrame with JavaGD?

我是 JRI/rJava/JavaGD 的新手,遇到了一些问题。我使用 JRI 绘制了一个简单的 R 图,并希望将此图包含在我的自定义 JFrame 中。我添加了 GDCanvas,其中的绘图应该出现在我的 JFrame 中。然而,绘图并未显示在 GDCanvas 中,而是在新框架中打开。如何在我的 JFrame 中可视化我的 R 图,而不是出现在它自己的框架中?

对我来说,另一种可能性是修改弹出情节的新框架。但我也无法在那里添加或修改任何内容。有没有一种特殊的方法可以修改用 JavaGD() 出现的帧?

有人可以帮助我吗?非常感谢。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.rosuda.JRI.Rengine;
import org.rosuda.javaGD.GDCanvas;

public class RjavaGD extends JFrame implements ActionListener {

    private Rengine engine;
    public static GDCanvas gdc;
    private JButton btn;

    public RjavaGD() {
        super();
        super.setTitle("My R Plot");

        btn = new JButton("show plot");
        btn.addActionListener(this);

        gdc = new GDCanvas(400, 400);
        gdc.setBackground(Color.PINK);

        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(btn, BorderLayout.PAGE_START);
        this.getContentPane().add((GDCanvas) gdc, BorderLayout.CENTER);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);

    // initialize R
        engine = new Rengine(new String[] { "--vanilla" }, false, null);
        engine.eval("library(JavaGD)");
          engine.eval("Sys.putenv('JAVAGD_CLASS_NAME'='RjavaGDInterface')");

    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new RjavaGD();
            }
        });
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == btn) {
            engine.eval("JavaGD()");
            engine.eval("a <- c(1,2,3,2,4)");
            engine.eval("plot(a,type=\"l\")");

            gdc.initRefresh();

            engine.end();

            this.setTitle("new random plot");
        }
    }

}


import org.rosuda.javaGD.GDInterface;

public class RjavaGDInterface extends GDInterface {

     public void gdOpen(double w, double h) 
     {
         c = RjavaGD.gdc;        
     }
}

我使用了 Sys.setenv() 而不是 Sys.putenv()。 我还找到了一种将绘图集成到我自己的自定义框架中的方法,这样我就可以在绘图的正下方添加按钮和其他东西,这在自动打开的标准框架中是不可能的。 这段代码对我来说很好用:

import org.rosuda.JRI.Rengine;
import org.rosuda.javaGD.GDCanvas;

public class RjavaGD extends JFrame implements ActionListener {

    private Rengine engine;
    private JButton btn;

    public RjavaGD() {
        super();
        super.setTitle("My R Plot");

        btn = new JButton("show plot");
        btn.addActionListener(this);
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(btn, BorderLayout.PAGE_START);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);

     }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == btn) {
        // initialize R
            engine = new Rengine(new String[] { "--vanilla" }, false, null);
            engine.eval("Sys.setenv('JAVAGD_CLASS_NAME'='RjavaGDInterface')");
            engine.eval("library(JavaGD)");

            engine.eval("JavaGD()");
            engine.eval("a <- c(1,2,3,2,4)");
            engine.eval("plot(a,type=\"l\")");

            engine.end();
        }
    }

}


import org.rosuda.javaGD.GDInterface;

public class RjavaGDInterface extends GDInterface {

     JFrame f;

     @Override
     public void gdOpen(double w, double h) {
        super.gdOpen(w,h);
        f = new JFrame();
        f.setLayout(new BorderLayout());
        c = new GDCanvas(w, h);

        f.setTitle("New Plot");
        f.getContentPane().add((GDCanvas) c, BorderLayout.CENTER);
        f.getContentPane().add(buttonPanel(), BorderLayout.NORTH);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);

     }
    private JPanel buttonPanel(){
        JPanel p = new JPanel();
        p.setBackground(Color.pink);

        p.add(new JLabel("Options“));
        p.add(new JButton("option1“))

        return p;
    }

}

我希望这能帮助其他遇到同样问题的人:)