0

「日曜日」などの日を表す JTextField があります。マウスを左クリックすると背景色が変わり、マウスを右クリックすると、メニュー項目をクリックした後にポップアップ メニューが表示されます。 、「月の1日」など、値を取得し、メニューを閉じてからbgcolorを変更します。私のコードは次のようになります:

    JTextField dayHeading=new JTextField("Su");
......
    final JPopupMenu Pmenu;
    JMenuItem menuItem;
    Pmenu=new JPopupMenu();
    menuItem=new JMenuItem("1st of month");
    Pmenu.add(menuItem);
    menuItem=new JMenuItem("2nd of month");
    Pmenu.add(menuItem);
......
    menuItem.addMouseListener(new MouseAdapter()
    {
      public void mouseReleased(final MouseEvent e)
      {
        System.out.println(((JMenuItem)e.getComponent()).getText());
        onHeadingClicked(e);  // Error : java.lang.ClassCastException: javax.swing.JMenuItem cannot be cast to javax.swing.JTextField
                              // How to get the orininal JTextField event that started this pop up menu, so I can pass it onto  onHeadingClicked() ?
      }
    });
......
    dayHeading.setEditable(false);
    dayHeading.setFocusable(false);
    dayHeading.addMouseListener(new MouseAdapter()
    {
        public void mouseReleased(final MouseEvent evt)
        {
          if (SwingUtilities.isLeftMouseButton(evt)) onHeadingClicked(evt);
          else if (SwingUtilities.isRightMouseButton(evt)) Pmenu.show(evt.getComponent(),evt.getX(),evt.getY());
        }
    });

......
    void onHeadingClicked(final java.awt.event.MouseEvent evt)
    {
      final javax.swing.JTextField fld=(javax.swing.JTextField) evt.getSource();
...
    }

私の質問は: menuItem.addMouseListener セクションで、このポップアップ メニューを開始した元の JTextField イベントを取得する方法です。

4

4 に答える 4

1

実際の例については、メニューの使用方法に関する Swing チュートリアルのセクションを参照してください。MouseListener は、メニュー項目の選択を処理するのではなく、ポップアップを表示するためにのみ使用されます。選択を処理するには、各メニュー項目に ActionListener を追加する必要があります。

この場合、ActionEvent がメニュー項目になります。したがって、ActionEvent の getSource() メソッドを使用してメニュー項目を取得できるはずです。次に、 getParent() メソッドを使用してポップアップ メニューを取得できます。最後に、getInvoker() メソッドを使用してテキスト フィールドを取得できます。何かのようなもの:

JMenuItem mi = (JMenuItem)e.getSource();
JPopupMenu popup = (JPopupMenu)mi.getParent();
JTextField tf = (JTextField)popup.getInvoker();

ただし、アクションを使用してメニュー項目を作成することをお勧めします。このチュートリアルには、説明と例を含む「アクションの使用方法」に関するセクションもあります。この場合、TextAction を拡張します。アクションが呼び出されると、アクションの getFocusedComponent() メソッドを使用してテキスト フィールドを取得できます。何かのようなもの:

class SelectAll extends TextAction
{
    public SelectAll()
    {
        super("Select All");
    }

    public void actionPerformed(ActionEvent e)
    {
        JTextComponent component = getFocusedComponent();
        component.selectAll();
    }
}
于 2011-01-01T19:37:27.963 に答える
0

mouselistener が JTextField ではなく JMenuItem にあるため、ClassCastException が発生しています。これらは互いに関連しない 2 つの別個のコンポーネントであるため、JMenuItem は JTextField が「開始した」ことを認識しないため、自分で関連付けを行わない限り、これを直接達成することはできません。

匿名アダプターを使用する代わりに、クラスを少し変更しないでください。

クラスに MouseListener を直接実装させます。

MouseListener インターフェイスのメソッドを実装します (主に mouseReleased()、mousePressed() など)。関心のないものは空のままにしておきます (宣言する必要があります)。

次に、これを変更します。

menuItem.addMouseListener(new MouseAdapter()
    {
      public void mouseReleased(final MouseEvent e)
      {
        System.out.println(((JMenuItem)e.getComponent()).getText());
        onHeadingClicked(e);  // Error : java.lang.ClassCastException: javax.swing.JMenuItem cannot be cast to javax.swing.JTextField
                              // How to get the orininal JTextField event that started this pop up menu, so I can pass it onto  onHeadingClicked() ?
      }
    });

これに:

menuItem.addMouseListener(this);

このようにして、クラス内のすべてのコンポーネントにアクセスでき、JTextField オブジェクトにアクセスできます。

于 2011-01-01T18:48:03.310 に答える
0

私はこのようにしました::

private void CommonMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                           
    JMenuItem menuItem = (JMenuItem)evt.getSource();         // source is clicked JMenuItem
    JPopupMenu popupMenu = (JPopupMenu)menuItem.getParent(); // get parent JPopupMenu
    Component component = popupMenu.getInvoker();            // who called JPopupMenu?
    System.out.println(component.getName());                 // get component name
}

これを機能させるには、JPopupMenus を持つコンポーネントに名前を付ける必要があります。

于 2016-02-19T10:00:04.503 に答える
0

私は簡単な修正を考えました:

  MouseEvent Right_Click_Mouse_Event;

...
    menuItem.addMouseListener(new MouseAdapter()
    {
      public void mouseReleased(final MouseEvent e)
      {
        Out(((JMenuItem)e.getComponent()).getText());
        onHeadingClicked(Right_Click_Mouse_Event,((JMenuItem)e.getComponent()).getText());
      }
    });
...
      dayHeading.addMouseListener(new MouseAdapter()
      {
        public void mouseReleased(final MouseEvent evt)
        {
          if (SwingUtilities.isLeftMouseButton(evt)) onHeadingClicked(evt,"");
          else if (SwingUtilities.isRightMouseButton(evt))
          {
            Pmenu.show(evt.getComponent(),evt.getX(),evt.getY());
            Right_Click_Mouse_Event=evt;
          }
        }
      });
...
  void onHeadingClicked(final java.awt.event.MouseEvent evt,String Order_In_Month)
  {
    final javax.swing.JTextField fld=(javax.swing.JTextField) evt.getSource();
...
  }

正常に動作します。

于 2011-01-01T19:25:30.677 に答える