[英]Access components of JFrame within MouseAdapter
使用適配器時從父組件訪問元素的正確方法是什么? 例:
在我的JFrame中是一個帶有“連接”項的菜單。 我使用MouseAdapter處理“按下”事件:
mntmConnect.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
mainDialog.getY();
}
});
如您所見,我想訪問此Menu(item)所屬的mainDialog的組件或方法。 但是,在那個MouseAdapter中,當然沒有“ mainDialog”是已知的。
所以這是我的方法:
1.聲明需要作為最終屬性的屬性
2.創建自己的MouseAdapter,將“ mainDialog”作為ctor中的變量
他們兩個對我來說似乎都是偶然的。 什么是正確的方法?
什么是正確的方法?
所有這三種方法都是正確的。
MouseAdapter
類,該類使用“ mainDialog”作為構造函數中的變量。 我傾向於將2用於小型MouseAdapter
匿名類。
對於較大的MouseAdapter
類,我傾向於使用3。 我將這些單獨的類放入控制器包中。
我使用MouseAdapter處理“按下”事件
您不應該這樣做。 您應該在JMenuItem中添加ActionListener(或Action)。
所有組件都有父母。 因此,如果您想知道所單擊菜單項的父窗口,則需要繼續查找父組件,直到到達該窗口。 這是一種方法:
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.