Java 内部帧侦听器不';不能使用单例枚举函数

Java 内部帧侦听器不';不能使用单例枚举函数,java,user-interface,Java,User Interface,我在下面的代码中创建了singleton/enum管理器,这样它可以跟踪已打开的内部帧的数量,并且当用户单击任何帧时,我都可以从中获取信息(这会激活帧)。但我不知道如何使这项工作,因为我希望当用户在第1帧(已打开的5帧中)单击“假设”时,我希望启用“保存”按钮。当没有一个窗口被激活时,我希望该按钮被禁用。我放置了一个内部框架侦听器和一个组件侦听器,但它们都不工作。我希望有人能告诉我哪里出了问题 代码如下: public class Manager implements ActionListen

我在下面的代码中创建了singleton/enum管理器,这样它可以跟踪已打开的内部帧的数量,并且当用户单击任何帧时,我都可以从中获取信息(这会激活帧)。但我不知道如何使这项工作,因为我希望当用户在第1帧(已打开的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

}

 }
公共类管理器实现ActionListener、InternalFrameListener、ComponentListener{
私有静态int-openFrameCount=0;
ImagePlus图像;
私人线砖;
最终字符串SHOW=“SHOW”;
静态成像窗口m;
JMenuItem showInfo;
静态项目保存;
静态JDesktopPane桌面;
信息图形用户界面;
公共管理器(ImagePlus img、字符串标题、JDesktopPane桌面、JMenuItem保存){
图像=img;
this.desktop=桌面;
this.tile=标题;
this.save=保存;
}
公共枚举窗口管理器{
例子
公共框架;
私有地图窗口;
专用WindowManager(){
mapWindows=新的HashMap(25);
}
公共类MyInternalFrame扩展了JInternalFrame{
静态最终int xPosition=30,yPosition=30;
公共MyInternalFrame(字符串标题、ImagePlus img、JMenuItem保存){
超级(标题,真,真,真,真);
设置大小(img.getWidth(),img.getHeight());
//设置窗口的位置。
setLocation(xPosition*openFrameCount,yPosition*openFrameCount);
save.setEnabled(true);
}
}
公共JInternalFrame createWindowFor(ImagePlus图像){
List frames=mapWindows.get(图像);
if(frames==null){
帧=新阵列列表(25);
mapWindows.put(图像、帧);
}
JPanel面板=新的JPanel();
ImageCanvas c=新的ImageCanvas(图像);
c、 getImage();
//panel2.add(新的JLabel(新的ImageIcon(c.getImage())));
m=新图像窗口(图像);
图像n=新图像();
//框架=新的MyInternalFrame(标题、img、保存、m);
//ImageCanvas c=m.getCanvas();
ImagePlus im=新ImagePlus();
im.setImage(图像);
frame=newmyinternalframe(image.getTitle(),image,save);
m、 centerNextImage();
image.getCanvas().setScaleToFit(true);
panel.add(m.getCanvas());
面板.立根背景(颜色.白色);
框架。添加(面板);
框架。添加(框架);
frame.setVisible(true);
frame.setAutoscrolls(真);
frame.setAutoscrolls(真);
frame.set不透明(true);
桌面。添加(框架);
试一试{
帧。已选择(真);
}catch(java.beans.PropertyVetoException){
}
返回框;
}
公共列表getFromFor(ImagePlus图像){
JInternalFrame frame=null;
返回mapWindows.get(image.getTitle());
}
}
@凌驾
已执行的公共无效操作(操作事件e){
//TODO自动生成的方法存根
SADAPP.Manager.WindowManager.MyInternalFrame m=(SADAPP.Manager.WindowManager.MyInternalFrame)WindowManager.INSTANCE.createWindowFor(图像);
}
@凌驾
public void internalFrameActivated(InternalFrameEvent arg0){
//TODO自动生成的方法存根
save.setEnabled(true);
}
@凌驾
公共无效internalFrameClosed(InternalFrameEvent arg0){
//TODO自动生成的方法存根
save.setEnabled(false);
}
@凌驾
公共无效internalFrameClosing(InternalFrameEvent arg0){
//TODO自动生成的方法存根
save.setEnabled(false);
}
@凌驾
公共无效internalFrameDeactivated(InternalFrameEvent arg0){
//TODO自动生成的方法存根
save.setEnabled(false);
}
@凌驾
公共无效internalFrameDeiconified(InternalFrameEvent arg0){
//TODO自动生成的方法存根
save.setEnabled(true);
}
@凌驾
公共无效InternalFrameIconnified(InternalFrameEvent arg0){
//TODO自动生成的方法存根
save.setEnabled(false);
}
@凌驾
公共无效InternalFrameOpen(InternalFrameEvent arg0){
//TODO自动生成的方法存根
save.setEnabled(true);
}
@凌驾
公共无效componentHidden(ComponentEvent arg0){
//TODO自动生成的方法存根
save.setEnabled(false);
}
@凌驾
public void componentMoved(ComponentEvent arg0){
//TODO自动生成的方法存根
}
@凌驾
public void ComponentResistized(ComponentEvent arg0){
//TODO自动生成的方法存根
矩形r=WindowManager.INSTANCE.frame.getBounds();
m、 getCanvas().fitToWindow(r);
System.out.println(“调整大小-真实的”);
}
@凌驾
显示的公共无效组件(组件事件arg0){
//TODO自动生成的方法存根
}
}

InternalFrameListener和ComponentListener接口的方法不会仅由现有接口调用。你需要打电话或在相框上告诉它你的听众

例如,在MyInternalFrame的构造函数中,您需要如下内容:

this.addInternalFrameListener(someInstanceOfTheManagerObject);

我还在enum(singleton)上实现了内部框架侦听器和ComponentListener,但它仍然不起作用。我不知道为什么。非常感谢你!真不敢相信我竟然忘了。再次感谢你!