我正在尝试将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");
}
}
答案 0 :(得分:1)
突然间,StackOverflow上有关于此主题的一系列问题[1,2,3,4,5,{{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。