0

アダプターが使用されている場合、親コンポーネントから要素にアクセスする正しい方法は何ですか? 例:

私のJFrameには、「接続」という項目を持つメニューがあります。「押された」イベントを MouseAdapter で処理します。

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

ご覧のとおり、この Menu(item) が属する mainDialog のコンポーネントまたはメソッドにアクセスしたいと考えています。しかし、もちろんその MouseAdapter では、「mainDialog」は知られていません。

だからここに私のアプローチがあります:

1. final として必要な属性を宣言する

2. 「mainDialog」を ctor の変数として受け取る独自の MouseAdapter を作成します。

どちらも私には状況に応じたものに思えます。これを行う正しい方法は何ですか?

4

2 に答える 2

0

これを行う正しい方法は何ですか?

これらの 3 つのアプローチはすべて正しいです。

  1. 匿名クラスに必要な属性を final として宣言します。
  2. 匿名クラスに必要な属性をクラス グローバルとして宣言します。
  3. MouseAdapterコンストラクターで「mainDialog」を変数として受け取るクラスを作成します。

MouseAdapter小さな匿名クラスには 2 を使用する傾向があります。

MouseAdapter私は大規模なクラスには 3 を使用する傾向があります。これらの個別のクラスを作成し、コントローラー パッケージに入れます。

于 2013-02-07T16:01:17.030 に答える
0

「押された」イベントを MouseAdapter で処理します

これを行うべきではありません。JMenuItem に ActionListener (または Action) を追加する必要があります。

すべてのコンポーネントには親があります。したがって、クリックされたメニュー項目の親ウィンドウを知りたい場合は、ウィンドウに到達するまで親コンポーネントを見つけ続ける必要があります。1 つの方法を次に示します。

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 に答える