簡體   English   中英

在MouseAdapter中訪問JFrame的組件

[英]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中的變量

他們兩個對我來說似乎都是偶然的。 什么是正確的方法?

什么是正確的方法?

所有這三種方法都是正確的。

  1. 將匿名類所需的屬性聲明為final。
  2. 將匿名類所需的屬性聲明為全局類。
  3. 創建一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM