ImageJ2自定义GUI

时间:2014-05-09 21:50:47

标签: java user-interface imagej

我正在尝试将imageJ窗口放在我创建的桌面窗格中,但是我在执行此操作时遇到了麻烦。如何使用imageJ2源代码来创建自定义GUI,其中imageJ窗口位于桌面窗格内? 这适用于imageJ2:https://github.com/imagej/imagej

下面是我尝试制作自定义GUI的代码,其中显示了图像窗口。但它与imageJ制作的原始窗口不同,因为它不包含有关图像的任何信息,您无法选择它。我想让imageJ窗口在桌面窗格内,但我无法这样做。

public class CustomGui extends ImageWindow implements InternalFrameListener, ActionListener {

    MyInternalFrame frame;
    int openFrameCount =0;
    ImagePlus img;
    boolean called = false;
    JMenuItem save;
    String title;
    final String SHOW ="show";

    public CustomGui(ImagePlus imp, String title, JDesktopPane desktop, final JMenuItem save) {
        super(imp);
        // TODO Auto-generated constructor stub
        setCall();
        img = imp;
        save.setEnabled(true);
        //this.title = title;
        FileInfo file = imp.getFileInfo();
        this.save = save;
        frame = new MyInternalFrame(title, img, save);
        JTextField text = new JTextField(img.getHeight());
        text.setVisible(true);
        text.setEditable(false);;
        frame.add(text);

        frame.add(new JLabel(new ImageIcon(imp.getImage())));

        frame.setVisible(true);
        desktop.add(frame);
        try {
            frame.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {

        }
        frame.addInternalFrameListener(this);
        // options(name, desktop);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals(SHOW)) {
            save.setEnabled(true);
            frame.addInternalFrameListener(this);
        }

        System.out.println("beingg called");
    }

    public void setCall() {
        called = true;
    }

    public void setCallF() {
        called = false;
    }

    public boolean getCall() {
        return called;
    }

    private class MyInternalFrame extends JInternalFrame {

        static final int xPosition = 30, yPosition = 30;
        public MyInternalFrame(String title, ImagePlus img, JMenuItem save) {
            super(title, true,true, true, true);
            setSize(img.getHeight(), img.getWidth());

            // Set the window's location.
            setLocation(xPosition * openFrameCount, yPosition * openFrameCount);
            save.setEnabled(true);
        }
    }

    @Override
    public void internalFrameActivated(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(true);
        System.out.println("resized");
    }

    @Override
    public void internalFrameClosed(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(false);
        System.out.println("resized");
    }

    @Override
    public void internalFrameClosing(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(false);
        System.out.println("resized");
    }

    @Override
    public void internalFrameDeactivated(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(false);
        System.out.println("resized");
    }

    @Override
    public void internalFrameDeiconified(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(true);
        System.out.println("resized");
    }

    @Override
    public void internalFrameIconified(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(false);
        System.out.println("resized");
    }

    @Override
    public void internalFrameOpened(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        //setCall();
        save.setEnabled(true);
        System.out.println("opened");
    }

}

1 个答案:

答案 0 :(得分:1)

突然间,StackOverflow上有关于此主题的一系列问题[12345,{{3} },6]。它们与ImageJ没什么关系。它们只是关于将基于SDI的应用程序(java.awt.Frame)调整为基于MDI的应用程序(javax.swing.JInternalFrame)的问题。

这样做是一项巨大的努力,特别是对于初级程序员而言。您将需要重写ImageJ 1.x代码库的大部分内容,因为它从未被设计为除了单个基于SDI AWT的UI之外的其他任何内容。

您需要完全熟悉Java Swing,尤其是MDI和JInternalFrame;请参阅7开始使用。

但仅凭这一点还不够。除非您通过极其谨慎的设计投入数百甚至数千小时,并利用Java Tutorial on JInternalFrame等先进技术,否则您最终会得到与ImageJ 1.x无向后兼容的内容,因此无法使用它的大部分插件。无论你做什么,一些插件都不会按你的意愿运行,因为它们直接依赖于ImageJ1的数据结构本质上是SDI AWT组件的事实。

因此,在对此曲目收费之前,我想问:你真的想要完成什么?你为什么做这个?最终目标是什么?它将如何帮助用户?

如果你因为某种原因认真想将ImageJ重新设计为MDI应用程序,那么我建议你查看Java bytecode manipulation。其主要目标之一是正确分离关注点 - 即保持数据模型逻辑与显示逻辑隔离 - 以便MDI用户界面之类的东西成为可能。它已经发展了四年多了,我们确实有ImageJ2。但它还不是很实用,而且UI框架本身仍然需要更多的迭代 - 这些组件仍然处于测试阶段,至少还会持续一年。非常欢迎您参与其中,我们很乐意回答有关它的具体技术问题,但对于那些尚未熟悉Java Swing的人来说,这将是一个非常陡峭的学习曲线。

在这里寻找替代方法来实现目标要容易得多。我鼓励你写一篇高级别的proof of concept MDI Swing user interface来描述你的需求。然后我们可以就前进的方向提出一些建议。

注意:此答案改编自ImageJ mailing list