[英]Internal Frame Listeners doesn't work with singleton enum function
我在以下代碼中創建了單例/枚舉管理器,以便它跟蹤已打開的內部框架的數量,並且當用戶單擊它時(可以激活框架),我可以從任何框架中獲取信息。 但是我不知道如何使它起作用,因為我想當用戶單擊第一幀(已打開的5幀中的第一幀)時,我希望啟用保存按鈕。 當所有窗口均未激活時,我希望禁用該按鈕。 我放置了一個內部框架偵聽器和一個組件偵聽器,但是它們都不起作用。 我希望有人能告訴我我要去哪里錯了。
這是代碼:
public class Manager implements ActionListener, InternalFrameListener, ComponentListener{
private static int openFrameCount =0;
ImagePlus image;
private String tile;
final String SHOW ="show";
static ImageWindow m;
JMenuItem showInfo;
static JMenuItem save;
static JDesktopPane desktop;
InfoGui in;
public Manager(ImagePlus img, String title, JDesktopPane desktop, JMenuItem save){
image = img;
this.desktop = desktop;
this.tile = title;
this.save = save;
}
public enum WindowManager {
INSTANCE;
public MyInternalFrame frame;
private Map<ImagePlus, List<MyInternalFrame>> mapWindows;
private WindowManager(){
mapWindows = new HashMap<>(25);
}
public 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.getWidth(),img.getHeight());
// Set the window's location.
setLocation(xPosition * openFrameCount, yPosition * openFrameCount);
save.setEnabled(true);
}
}
public JInternalFrame createWindowFor(ImagePlus image) {
List<MyInternalFrame> frames = mapWindows.get(image);
if (frames == null) {
frames = new ArrayList<>(25);
mapWindows.put(image, frames);
}
JPanel panel = new JPanel();
ImageCanvas c = new ImageCanvas(image);
c.getImage();
//panel2.add(new JLabel(new ImageIcon(c.getImage())));
m = new ImageWindow(image);
Image n = new Image();
//frame = new MyInternalFrame(title, img, save,m);
//ImageCanvas c = m.getCanvas();
ImagePlus im = new ImagePlus();
im.setImage(image);
frame = new MyInternalFrame(image.getTitle(), image, save);
m.centerNextImage();
image.getCanvas().setScaleToFit(true);
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);
desktop.add(frame);
try {
frame.setSelected(true);
} catch (java.beans.PropertyVetoException e) {
}
return frame;
}
public List<MyInternalFrame> getFromFor(ImagePlus image) {
JInternalFrame frame = null;
return mapWindows.get(image.getTitle());
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
SADAPP.Manager.WindowManager.MyInternalFrame m = (SADAPP.Manager.WindowManager.MyInternalFrame) WindowManager.INSTANCE.createWindowFor(image);
}
@Override
public void internalFrameActivated(InternalFrameEvent arg0) {
// TODO Auto-generated method stub
save.setEnabled(true);
}
@Override
public void internalFrameClosed(InternalFrameEvent arg0) {
// TODO Auto-generated method stub
save.setEnabled(false);
}
@Override
public void internalFrameClosing(InternalFrameEvent arg0) {
// TODO Auto-generated method stub
save.setEnabled(false);
}
@Override
public void internalFrameDeactivated(InternalFrameEvent arg0) {
// TODO Auto-generated method stub
save.setEnabled(false);
}
@Override
public void internalFrameDeiconified(InternalFrameEvent arg0) {
// TODO Auto-generated method stub
save.setEnabled(true);
}
@Override
public void internalFrameIconified(InternalFrameEvent arg0) {
// TODO Auto-generated method stub
save.setEnabled(false);
}
@Override
public void internalFrameOpened(InternalFrameEvent arg0) {
// TODO Auto-generated method stub
save.setEnabled(true);
}
@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 r = WindowManager.INSTANCE.frame.getBounds();
m.getCanvas().fitToWindow(r);
System.out.println("resized- the real one");
}
@Override
public void componentShown(ComponentEvent arg0) {
// TODO Auto-generated method stub
}
}
InternalFrameListener和ComponentListener接口的方法不會僅被現有方法調用。 您需要在框架上調用addInternalFrameListener
或addComponentListener
來告訴它有關您的偵聽器的信息。
例如,在MyInternalFrame的構造函數中,您需要以下內容:
this.addInternalFrameListener(someInstanceOfTheManagerObject);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.