2014-05-21 70 views
0

下面這兩個類的含義是當用戶假設打開5個窗口(包含圖像的框架),然後用戶單擊第二個框架並想要關於該圖像的信息時我能得到這些幀信息嗎?在我之前的問題中,有人建議做單態枚舉,我有點理解它並實現,但我不能包裝我的頭,當用戶點擊內部框架時,經理類將發送路徑到Info類。保持跟蹤窗口及其信息

我前面的問題:How to keep track of previous opened internal frames

這是Manager類:

public class Manager implements ActionListener{ 

private static int openFrameCount =0; 
ImagePlus image; 
private static String title; 
final String SHOW ="show"; 
static ImageWindow m; 
static JMenuItem showInfo; 
static JMenuItem save; 
static JDesktopPane desktop; 
InfoGui in; 
JMenuItem fft; 

public Manager(ImagePlus img, String title, JDesktopPane desktop, JMenuItem save, JMenuItem fft, JMenuItem showInfo2){ 
    image = img; 
    this.desktop = desktop; 
    this.title = title; 
    this.save = save; 
    this.fft = fft; 
    this.showInfo= showInfo; 
} 

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 { 

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

     } 
     frame.addInternalFrameListener(this); 
     frame.addComponentListener(this); 
     return frame; 

    } 

    public List<MyInternalFrame> getImage() { 

     JInternalFrame frame = null; 
     return mapWindows.get(title); 

    } 

    @Override 
    public void internalFrameActivated(InternalFrameEvent arg0) { 
     // TODO Auto-generated method stub 
     save.setEnabled(true); 
     //showInfo.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); 
     //showInfo.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); 
     //showInfo.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 = frame.getBounds(); 

     m.getCanvas().fitToWindow(r); 
     System.out.println("resized- the real one"); 
    } 

    @Override 
    public void componentShown(ComponentEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 
    SADAPP.Manager.WindowManager.MyInternalFrame m = (SADAPP.Manager.WindowManager.MyInternalFrame) WindowManager.INSTANCE.createWindowFor(image); 
} 

} 

這是我的信息類:

public class Info implements ActionListener{ 

private static int openFrameCount =0; 
ImagePlus image; 
private static String title; 
final String SHOW ="show"; 
static ImageWindow m; 
JMenuItem showInfo; 
static JMenuItem save; 
static JDesktopPane desktop; 
InfoGui in; 
JMenuItem fft; 

public Info(ImagePlus img, String title, JDesktopPane desktop, JMenuItem save, JMenu fft){ 
    image = img; 
    this.desktop = desktop; 
    this.title = title; 
    this.save = save; 
    this.fft = fft; 
} 

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 { 

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

     frame = new MyInternalFrame(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); 
     //text.setBackground(new Color(0,0,0,0)); 
     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.setVisible(true); 
     desktop.add(frame); 
     try { 
       frame.setSelected(true); 
     } catch (java.beans.PropertyVetoException e) { 

     } 
     frame.addInternalFrameListener(this); 
     return frame; 

    } 

    public List<MyInternalFrame> getFromFor(ImagePlus image) { 

     JInternalFrame frame = null; 
     return mapWindows.get(title); 

    } 

    @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 = frame.getBounds(); 

     m.getCanvas().fitToWindow(r); 
     System.out.println("resized- the real one"); 
    } 

    @Override 
    public void componentShown(ComponentEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 
    JInternalFrame b = WindowManager.INSTANCE.createWindowFor(image); 
} 

} 

,並在主類中,如果用戶點擊打開並選擇一張圖片,我這樣做:

v= new Manager(img, s, desktop, save, fft,showInfo); 
ActionEvent e = null; 
v.actionPerformed(e); 

這會打開圖像窗口,現在假設用戶打開另外4張圖像,所以這稱爲4次。現在,當用戶點擊一個框架然後點擊showInfo時,我想讓信息類獲取圖像標題並顯示信息。所以這是我做的:

List<MyInternalFrame> v = WindowManager.INSTANCE.getImage(); 
ImagePlus i = new ImagePlus(v.get(0).getTitle()); //This is where the image is null 
Info n = new Info(i,i.getTitle(), desktop, save, fft); 
ActionEvent s = null; 
n.actionPerformed(s); 

這是我遇到的麻煩!!!!!!我希望任何人都能發現錯誤。提前致謝。

回答

0

嗯,我看到的一件事是,通常會使用addActionListener()來註冊偵聽器,而不是直接在Java中直接調用actionPerformed。因此,像:

someComponent.addActionListener(new Manager()); 

所以動作監聽器,你的經理,就必須與實際成分

+0

謝謝你相關!我現在明白了。 – selena