66107


以下のようにJRIを使って正規分布の確率密度関数のグラフを形成してそれをnormal.pngと名付けてファイルに保存しました。そのあとにJFrameに張りたいのですが、画像のように表示されるだけで何も出てこないです。しっかりとファイル内には画像が作られているのですが。これはなんでなんでしょうか。教えていただけると幸いです。また、ファイル保存を介さないで直接貼る方法があればそちらも教えていただけると助かります。

[![このようになります](https://i.stack.imgur.com/RlkNr.png)](https://i.stack.imgur.com/RlkNr.png)

[code]

    import org.rosuda.JRI.REXP;
    import org.rosuda.JRI.Rengine;
    import javax.swing.*;
    import java.awt.BorderLayout;
    
    public class ZTestCalculation
    {
         public static void main (String[] args)
         {
            //This is a method to create graph and save it as png file
            Rengine engine = new Rengine(new String[]{"--no-save"}, false, null);
            engine.eval("png('normal.png', 640, 480)");
            engine.eval("plot(dnorm, -4, 4)");
            engine.eval("xvals <- seq(qnorm(10), 4, length=100)");
            engine.eval("dvals <- dnorm(xvals)");
            engine.eval("polygon(c(xvals,rev(xvals)),c(rep(0,100),rev(dvals)),col=\"gray\")");
            engine.eval("dev.off()");
            engine.end();
    
    //This is a method to stick png file to JFrame 
            ZTestCalculation frame = new ZTestCalculation();
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBounds(10, 10, 150, 150);
            frame.setTitle("Z-Graph");
            frame.setVisible(true);
            JPanel p = new JPanel();
            p.setSize(500,640);
            ImageIcon icon = new ImageIcon("normal.png");
            JLabel label = new JLabel(icon);
            label.setIcon(icon); 
            p.add(label);
            getContentPane().add(p, BorderLayout.CENTER);
        }
    }
    
    
    
[/code]


CC BY-SA 4.0
2020-04-29T09:19:59.633
66100
2020-04-29T10:32:49.703
36217
question
java r swing
JFrameにファイルから読み込んだ画像を貼る


`frame.setVisible(true);` を最後にもってくれば描画された状態で表示されると思います。  
また、[`frame.pack()`](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/java/awt/Window.html#pack\(\))
の実行も望まれているかと思われます。

ただし根本的な原因としては、[イベントディスパッチスレッド](https://ja.stackoverflow.com/a/26894/2808)で実行していないことです。

[code]

        //This is a method to stick png file to JFrame 
        SwingUtilities.invokeLater(() -> {
            ZTestCalculation frame = new ZTestCalculation();
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBounds(10, 10, 150, 150);
            frame.setTitle("Z-Graph");
            JPanel p = new JPanel();
            p.setSize(500, 640);
            ImageIcon icon = new ImageIcon("normal.png");
            JLabel label = new JLabel(icon);
            label.setIcon(icon);
            p.add(label);
            frame.getContentPane().add(p, BorderLayout.CENTER);
            frame.pack();
            frame.setVisible(true);
        });
    
[/code]

* * *

> ファイル保存を介さないで直接貼る方法

ストリームに出力すれば、[`ImageIO`](https://docs.oracle.com/javase/jp/11/docs/api/java.desktop/javax/imageio/ImageIO.html)と
[`Graphics`](https://docs.oracle.com/javase/tutorial/2d/images/drawimage.html)を用いて実現可能かと考えます。  
ただ、私はJRIについて知らないので、そのようなインタフェースが用意されているかは分かりません。


CC BY-SA 4.0
2020-04-29T10:32:49.703
66107
2020-04-29T10:32:49.703
2808
66100
answer