第2帧打开后,第1帧组件侦听器不起作用

时间:2014-05-23 18:25:01

标签: java swing user-interface jinternalframe jmenuitem

当我打开第二帧(显示第一帧中包含的图像的信息)时,第一帧组件监听器不起作用。我不知道为什么,因为两个班都没有联系。有人知道为什么会这样吗?

以下是第一帧代码的一部分:

  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 个答案:

答案 0 :(得分:0)

所以我发现了如何使这项工作。我不会,如果它能帮助任何人,但最好发送该图像的副本,以便它可以被改变,并且它不会改变原始图像。

代码是这样的:

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);