Слушатель компонента кадра 1 не работает после открытия второго кадра
Когда я открываю 2-й кадр (который отображает информацию об изображении, содержащемся в первом кадре), слушатель компонента первого кадра не работает. Я не знаю почему, потому что ни один класс не связан. Кто-нибудь знает, почему это могло произойти?
Вот часть моего кода для 1-го кадра:
public enum WindowManager implements InternalFrameListener, ComponentListener {
INSTANCE;
public MyInternalFrame frame;
private Map<ImagePlus, List<MyInternalFrame>> mapWindows;
private WindowManager(){
mapWindows = new HashMap<>(25);
}
public class MyInternalFrame extends JInternalFrame {
ImagePlus img;
String title;
static final int xPosition = 30, yPosition = 30;
public MyInternalFrame(String imageTitle, ImagePlus img, JMenuItem save, String title2) {
super("jskldjkfjd", true,true, true, true);
System.out.println(imageTitle);
this.img = img;
this.title = title2;
setSize(img.getWidth(),img.getHeight());
// Set the window's location.
setLocation(xPosition * openFrameCount, yPosition * openFrameCount);
save.setEnabled(true);
}
public void setImage(ImagePlus imp){
img = imp;
}
public ImagePlus getImage(){
return img;
}
public String getTitle(){
return title;
}
}
public JInternalFrame createWindowFor(ImagePlus image) {
List<MyInternalFrame> frames = mapWindows.get(image);
if (frames == null) {
frames = new ArrayList<>(25);
mapWindows.put(image, frames);
}
//frame.getContentPane().removeAll();
JPanel panel = new JPanel();
ImageCanvas c = new ImageCanvas(image);
c.getImage();
m = new ImageWindow(image);
Image n = new Image();
ImagePlus im = new ImagePlus();
im.setImage(image);
String [] array = title.split("/");
//System.out.println("in manager: "+array[5]);
//image.setTitle(path);
frame = new MyInternalFrame(image.getTitle(), image, save, title);
m.centerNextImage();
//image.getCanvas().setScaleToFit(true);
//m.getCanvas().repaint();
m.repaint();
panel.add(m.getCanvas());
panel.setBackground(Color.white);
frame.add(panel);
frames.add(frame);
frame.setVisible(true);
frame.setAutoscrolls(true);
frame.setAutoscrolls(true);
//frame.setOpaque(true);
frame.setResizable(true);
desktop.add(frame);
try {
frame.setSelected(true);
} catch (java.beans.PropertyVetoException e) {
}
frame.addInternalFrameListener(this);
frame.addComponentListener(this);
return frame;
}
public List<MyInternalFrame> getImage() {
JInternalFrame frame = null;
return mapWindows.get(title);
}
public List<MyInternalFrame> getImg(){
return mapWindows.get(image);
}
@Override
public void componentHidden(ComponentEvent arg0) {
// TODO Auto-generated method stub
//save.setEnabled(false);
}
@Override
public void componentMoved(ComponentEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void componentResized(ComponentEvent arg0) {
// TODO Auto-generated method stub
Rectangle rect = desktop.getSelectedFrame().getBounds();
//frame.getContentPane().removeAll();
MyInternalFrame f = (MyInternalFrame) desktop.getSelectedFrame();
// m.getCanvas().zoomIn(0, 0);
f.getImage().getCanvas().fitToWindow(rect);
//f.repaint();
}
Когда JMenuItem щелкают, он отображает этот 2-й кадр.
public enum WindowManager implements InternalFrameListener{
INSTANCE;
public MyFrame frame;
private Map<ImagePlus, List<MyFrame>> mapWindows;
private WindowManager(){
mapWindows = new HashMap<>(25);
}
private class MyFrame extends JInternalFrame {
static final int xPosition = 30, yPosition = 30;
public MyFrame(String title, ImagePlus img, JMenuItem save) {
super(title, true,true, true, true);
setSize(700,400);
// Set the window's location.
setLocation(xPosition * openFrameCount, yPosition * openFrameCount);
save.setEnabled(true);
}
}
public JInternalFrame createWindowFor(ImagePlus image) {
List<MyFrame> frames = mapWindows.get(image);
if (frames == null) {
frames = new ArrayList<>(25);
mapWindows.put(image, frames);
}
frame = new MyFrame(image.getTitle(), image, save);
JPanel panel = new JPanel();
JPanel panel2 = new JPanel();
JTextArea text = new JTextArea();
String info = "Image Information: \n\n";
info += "Image Name: "+image.getTitle()+ "\n";
info += "Pixel Size: ";
info += (image.getHeight() +" x "+image.getWidth() +"\n");
info += ("Bit Depth: " + image.getBitDepth() + "-bit"+"\n");
info+= "Bytes/Pixel: "+image.getBytesPerPixel() + "\n";
info += "Type of: "+image.getType()+ "\n";
info += "Diplay range: " + image.getDisplayRangeMax() +"\n";
info += "Display range(min): " + image.getDefault16bitRange() + "\n";
info += image.getFileInfo();
info += image.getInfoProperty();
//System.out.println(info);
text.setText(info);
System.out.println(image.getHeight());
text.setVisible(true);
text.setEditable(false);
panel.add(text);
JScrollPane scroll = new JScrollPane(panel);
ImageWindow m = new ImageWindow(image);
panel2.add(new JLabel(new ImageIcon(image.getImage())));
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scroll, panel2);
splitPane.setOpaque(true);
panel.setMinimumSize(new Dimension(500,100));
panel.setBackground(new Color(0,0,0,0));
panel2.setMinimumSize(new Dimension(200,30));
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(290);
frame.add(splitPane);
frame.setAutoscrolls(true);
frame.setResizable(true);
frame.setVisible(true);
frame.toFront();
desktop.add(frame);
try {
frame.setSelected(true);
} catch (java.beans.PropertyVetoException e) {
}
// frame.addInternalFrameListener(this);
return frame;
}
public List<MyFrame> getFromFor(ImagePlus image) {
JInternalFrame frame = null;
return mapWindows.get(title);
}
В главном классе, где находится нажатие кнопки (получить текущий выбранный кадр, а затем отобразить информацию об изображении этого кадра):
showInfo = new JMenuItem("Show Image Info");
showInfo.setEnabled(false);
showInfo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, ActionEvent.ALT_MASK));
showInfo.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
MyInternalFrame selectedFrame = (MyInternalFrame) desktop.getSelectedFrame();
selectedFrame.getImage();
Info b =new Info(selectedFrame.getImage(), selectedFrame.getImage().getTitle(), desktop, save, fft);
ActionEvent s = null;
b.actionPerformed(s);
}
});
1 ответ
Решение
Итак, я узнал, как сделать эту работу. Не знаю, поможет ли это кому-нибудь, но лучше всего послать дубликат этого изображения, чтобы потом его можно было изменить и не изменить исходное изображение.
Код выглядит так:
MyInternalFrame selectedFrame = (MyInternalFrame) desktop.getSelectedFrame();
selectedFrame.getImage();
title = selectedFrame.getTitle();
Info b =new Info(selectedFrame.getImage().duplicate(), selectedFrame.getImage().getTitle(), desktop, save, fft);
ActionEvent s = null;
b.actionPerformed(s);