2013-02-07 32 views
0

使用適配器時,從父組件訪問元素的正確方法是什麼?例如:在MouseAdapter中訪問JFrame的組件

在我的JFrame是一個菜單項目「連接」。我處理「按下」事件與MouseAdapter:

mntmConnect.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent arg0) { 
      mainDialog.getY(); 
     } 
    }); 

正如你可以看到我想去的地方這個菜單(項目)屬於訪問組件或mainDialog的方法。但在那個MouseAdapter當然沒有「mainDialog」是已知的。

因此,這裏有我的方法:

1.聲明屬性,一個需要作爲最終

2.創建您自己的MouseAdapter認爲以「mainDialog」作爲一個變量在構造函數

他們兩人對我來說似乎很環保。什麼是正確的方法來做到這一點?

回答

0

什麼是正確的方法來做到這一點?

這三種方法都是正確的。

  1. 將匿名類所需的屬性聲明爲final。
  2. 將匿名類所需的屬性聲明爲全局類。
  3. 創建一個MouseAdapter類,它在構造函數中將「mainDialog」作爲變量。

我傾向於使用2爲小MouseAdapter匿名類。

我傾向於將3用於較大的MouseAdapter類。我製作這些單獨的類並將它們放入控制器包中。

0

我處理 「按下」 事件與MouseAdapter

你不應該這樣做。您應該將ActionListener(或Action)添加到JMenuItem中。

所有成員都有一位家長。所以如果你想知道被點擊的菜單項的父窗口,你需要繼續找到父母組件,直到你到達窗口。這裏有一種方法:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MenuItemFrame extends JFrame implements ActionListener 
{ 
    public MenuItemFrame() 
    { 
     JMenuBar menuBar = new JMenuBar(); 
     setJMenuBar(menuBar); 

     JMenu menu = new JMenu("File"); 
     menuBar.add(menu); 

     JMenuItem item1 = new JMenuItem("Item 1"); 
     item1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0, false)); 

     menu.add(item1); 

     JMenu subMenu1 = new JMenu("SubMenu 1"); 
     menu.add(subMenu1); 

     JMenuItem subItem1 = new JMenuItem("SubItem 1"); 
     subMenu1.add(subItem1); 

     JMenu subMenu12 = new JMenu("SubMenu 12"); 
     subMenu1.add(subMenu12); 

     JMenuItem subItem12 = new JMenuItem("SubItem 12"); 
     subMenu12.add(subItem12); 

     item1.addActionListener(this); 
     subItem1.addActionListener(this); 
     subItem12.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     JMenuItem mi = (JMenuItem)e.getSource(); 
     mi.setText(mi.getText() + "0"); 
     JMenu menu = getMenuBarMenu(mi); 

     JRootPane rootPane = SwingUtilities.getRootPane(menu); 
     JFrame frame = (JFrame)SwingUtilities.windowForComponent(menu); 
     System.out.println(frame); 

    } 

    public JMenu getMenuBarMenu(JMenuItem item) 
    { 
     JMenu menu = null; 

     while (menu == null) 
     { 
      JPopupMenu popup = (JPopupMenu)item.getParent(); 
      item = (JMenuItem)popup.getInvoker(); 

      if (! (item.getParent() instanceof JPopupMenu)) 
       menu = (JMenu)item; 
     } 

     return menu; 
    } 


    public static void main(String[] args) 
    { 
     JFrame frame = new MenuItemFrame(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
}