2011-12-28 6 views
2

ユーザーが "ALT"キーを押したときにjmenubar内のjmenuを自動選択する方法はありますか? (Windowsソフトのような)"alt"キープレスの最初のjmenubar項目に焦点を合わせる

"ALT"キーを押したときのmy jframeのデフォルトの動作は、リストア、移動、サイズ、縮小、などのアクションを含むメニューを表示することです。

私のJavaアプリケーションでしたいことは、「alt」を押したときにjmenuの最初の項目を選択することです。 (ニーモニック: "alt + f"と同様)

+1

私が使用する(そしてJavaアプリケーションで)Windowsアプリケーションでは、Alt + Spaceを使用すると、「復元、移動、サイズ...」アクションを含むシステムメニューが表示されます。 Altキーを押したままにすると、Altキーを離したときにメニューバーの最初のメニューが強調表示されます。したがって、あなたの行動は両方とも非標準的に見える必要があります。あなたの現在の問題をAltキーで示すSSCCD(http://www.sscce.org)を投稿してください。 – camickr

答えて

6

はあなたのJRootPaneActionMapInputMapにアクションを追加します。以下を参照してください。

import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 


public class MenuExample { 

    private void setupMenuKey(final JFrame frame) { 
     Action menuAction = new AbstractAction() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JRootPane rootPane = frame.getRootPane(); 
       JMenuBar jMenuBar = rootPane.getJMenuBar(); 
       JMenu menu = jMenuBar.getMenu(0); 
       menu.doClick(); 
      } 
     }; 

     JRootPane rootPane = frame.getRootPane(); 
     ActionMap actionMap = rootPane.getActionMap(); 

     final String MENU_ACTION_KEY = "expand_that_first_menu_please"; 
     actionMap.put(MENU_ACTION_KEY, menuAction); 
     InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, 0, true), MENU_ACTION_KEY); 
    } 


    private JFrame build() { 
     JFrame frame = new JFrame("Hello"); 
     frame.setSize(300, 300); 

     JMenuBar bar = new JMenuBar(); 

     List<String> letters = Arrays.asList("A", "B", "C"); 
     for (int i = 0; i < 3; i++) { 
      JMenu menu = new JMenu("Menu " + i); 
      for (String string : letters) { 
       menu.add(new JMenuItem(String.format("Menu %s - %s", i, string))); 
      } 
      bar.add(menu); 
     } 
     frame.setJMenuBar(bar); 

     JButton b = new JButton("click"); 
     JPanel p = new JPanel(); 
     p.add(b); 
     frame.add(p); 
     setupMenuKey(frame); 

     return frame; 
    } 

    public static void main(String[] args) { 
     MenuExample menuExample = new MenuExample(); 
     JFrame frame = menuExample.build(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 


} 
+0

+1はルートペインを使用しています – camickr

+0

これは素晴らしい機能でした!ありがとうございました ! – Jsncrdnl

0

このジョブを実行するには、JComponentのactionmapとinputmapを使用します。 JFrameのはJCompoenentの子孫ではないので、私はあなたがあなたのJFrameにJPanelのを追加することをお勧めしてから、

Action action = new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      jMenu1.doClick(); 
     } 
    }; 
    jPanel1.getActionMap().put("myAction", action); 
    jPanel1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, KeyEvent.ALT_DOWN_MASK), "myAction"); 
0

私は非常に便利ですが、欠点もあります。

Cross PlatForm L & F(Metal)を使用していて、すべてのメニューにニーモニックを定義したとします。それらのメニューは押してから呼び出されることがわかります。したがって、ブラックパンダによって提供されたソリューションを置くと、まず最初にメニューが展開された直後に、展開されたメニューが表示されます。

私は、最初のメニューだけを押して、その内容を表示せずにALTを押すことが最善の方法だと思っています(これらの内容は、ダウンキーを押すと表示されます)。クロスプラットフォームL & F?でこれを行う方法はありますか?

また、別のコードなしで進める別の方法があります。システムL & F(私の場合はWindows)を呼び出すと、ALTキーは必要に応じて動作します。詳細については、stackoverflowの質問13474555を参照してください。

+1

これは、この質問への回答ではなく、これを元にした独自の質問でなければなりません。 – ricksmt

0

私はframe.setJMenuBar(jmenubar);を使用して見つけました。frameはあなたのJFrameで、jmenubarはあなたのJMenuBarです。これは自動的にこれを行います。レイアウトマネージャに追加する必要はありません。

関連する問題