在MouseAdapter中访问JFrame的组件

时间:2013-02-07 14:58:53

标签: java adapter

使用适配器时从父组件访问元素的正确方法是什么?例如:

在我的JFrame中是一个带有“连接”项的菜单。我使用MouseAdapter处理“按下”事件:

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

如您所见,我想访问此菜单(项目)所属的mainDialog的组件或方法。但是在那个MouseAdapter中当然没有“mainDialog”。

所以这是我的方法:

1。声明所需的属性为最终

2。创建自己的MouseAdapter,将“mainDialog”作为ctor中的变量

它们对我来说都是间接的。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

  

这样做的正确方法是什么?

所有这3种方法都是正确的。

  1. 声明匿名类所需的属性为final。
  2. 将匿名类所需的属性声明为类全局。
  3. 创建一个MouseAdapter类,将“mainDialog”作为构造函数中的变量。
  4. 我倾向于将2用于小MouseAdapter个匿名类。

    我倾向于将3用于较大的MouseAdapter类。我制作这些单独的类并将它们放在控制器包中。

答案 1 :(得分: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);
    }
}