将图像从JFrame传递到另一个JFrame

时间:2013-12-01 16:41:47

标签: java image swing load icons

我创建了一个项目,当它运行时,会裁剪图像并制作屏幕截图。我希望将屏幕截图放在另一个不同的JFrame中。如何加载屏幕截图?任何的想法?

我把代码放在两个不同的框架上。第一帧(Frame1)制作屏幕截图,在第二帧(Results)上,我想传递屏幕截图并将其放在一个JLabel中。

2 个答案:

答案 0 :(得分:1)

在两个不同的JVM中运行的两个JFrame之间的通信!不,我永远不会注意做你想要实现的目标。这种方法记忆多达两倍,需要不成熟但复杂的做事方式,使整个过程不仅缓慢,而且不是很有道理。

我们应该设计流程的方式:

  1. 使用一个JFrame
  2. 如果需要更改具有不同视图的内容窗格:请使用CardLayout
  3. 如果需要在Stack中一次查看多个组件,一个在另一个上方使用JLayeredPane:这对您的用例更为完美
  4. 对于需要后台执行并在任务的就绪部分更新GUI的连续渐进任务,请使用SwingWorker
  5. 现在讨论如何使用它们来实现目标将花费巨大的空间和时间成本,因此超出了您的问题的范围。请逐一查看这篇文章:

    1. Using multiple JFrame: good vs bad
    2. How to use Layered Pane
    3. Worker threads and SwingWorker
    4. 修改

      是的,我确实有一个解决方案,需要两个额外的线程:

      1. 使用Frame从JVM将屏幕截图的新图像写入文件位置:使用ImageIO.write()。我会将文件命名为当前时间和适当的图片扩展名(jpg,png等):currentTimestamp.jpg currentTimeStamp.png

      2. 包含Results框架的JVM的另一个线程,用于检查新图像文件是否可用,如果是,请使用ImageIO.read()读取,然后从文件位置删除。

      3. 退房:How to use ImageIO to read and write

答案 1 :(得分:1)

由于您使用以下两行保存文件:

File save_path=new File("right.jpg");
ImageIO.write(img, "JPG", save_path);

您只需将right.jpg文件读入第二帧即可。下面的JFrame将图像加载到JLabel中,然后将其添加到JPanel中。

public class Result extends JFrame {

    public Result(){
        getContentPane().setBackground(Color.white);
        initComponents();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        add(panel);
        JLabel im = new JLabel(new ImageIcon("right.jpg"));
        panel.add(im);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Result tmp = new Result();
                tmp.setSize(600, 600);
                tmp.setVisible(true);
            }
        });
    }
}