使用适配器时从父组件访问元素的正确方法是什么?例如:
在我的JFrame中是一个带有“连接”项的菜单。我使用MouseAdapter处理“按下”事件:
mntmConnect.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
mainDialog.getY();
}
});
如您所见,我想访问此菜单(项目)所属的mainDialog的组件或方法。但是在那个MouseAdapter中当然没有“mainDialog”。
所以这是我的方法:
1。声明所需的属性为最终
2。创建自己的MouseAdapter,将“mainDialog”作为ctor中的变量
它们对我来说都是间接的。这样做的正确方法是什么?
答案 0 :(得分:0)
这样做的正确方法是什么?
所有这3种方法都是正确的。
MouseAdapter
类,将“mainDialog”作为构造函数中的变量。我倾向于将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);
}
}