0

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

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

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

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

所以这是我的方法:

1. 将需要的属性声明为 final

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

在我看来,这两个都是间接的。这样做的正确方法是什么?

4

2 回答 2

0

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

这三种方法都是正确的。

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

我倾向于将 2 用于小型MouseAdapter匿名类。

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

于 2013-02-07T16:01:17.030 回答
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);
    }
}
于 2013-02-07T16:53:03.413 回答