3

Windows XP で実行されている Java Swing アプリケーションで、コンテキスト メニューのニーモニックに一貫して下線を表示するのに問題があります。

マウスを右クリックしても、ポップアップ メニューに下線が表示されません。これは問題ありません。このような動作は、他の Windows アプリケーションと一致しています。

しかし、メニュー キー (通常は右側の Windows キーの横) でポップアップ メニューを表示すると、Swing アプリケーションでは下線が表示されませんが、ワードパッド、エクスプローラー、コントロール パネルなどの標準の Windows アプリケーションでは下線が表示されます。

下線を表示する唯一の方法は、Alt キーを押しながらマウスを右クリックすることです。誰かがすでに右クリックするマウスを持っている場合、ポップアップで何かを選択するためにキーボードを使用したくないため、これは一種の役に立ちません。

メニュー キーからコンテキスト メニューを呼び出したときに、Swing で下線を表示することはできますか? 独自のルック アンド フィール ライブラリを作成せずに?

4

1 に答える 1

0

良い質問。OS Xでこれを試したところ、下線付きの文字も表示されません。あなたと同じように、代替ボタンを押すことでそれらを取得します(クリック時ではなく、ポップアップメニューが表示されたとき)。

ただし、OS XI では、下線付きの文字を含むポップアップを記憶できません。デフォルトのアプリケーションをいくつか確認しましたが、下線付きのポップアップ メニューが表示されるアプリケーションはありませんでした。簡単な Google 検索でもこれが示されました。したがって、この場合、ルック アンド フィールは OS と一致しています。

さらにグーグルで調べた後、Windowsにはデフォルトでニーモニックを非表示にし、altを押したときにのみ表示するオプションがあることを示唆する次のトピックを見つけました(正しく覚えていれば、ニーモニックを使用するにはとにかく押す必要があります私の窓の日)。あなたはそれを試してみたいかもしれません。

とにかく、これはWindowsユーザーがこれをすばやくテストできるSSCCEです。

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPopupMenu;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

public class MnemonicTest {
  public static JFrame createUI(){
    JFrame testFrame = new JFrame(  );

    testFrame.add( createLabelWithPopupMenu() );

    testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    testFrame.pack();
    return testFrame;
  }

  private static JLabel createLabelWithPopupMenu(){
    JLabel result = new JLabel( "Right-click me" );
    result.setComponentPopupMenu( createPopupMenu() );
    return result;
  }



  private static JPopupMenu createPopupMenu(){
    JPopupMenu popupMenu = new JPopupMenu(  );
    popupMenu.add( createAction() );
    return popupMenu;
  }

  private static Action createAction(){
    AbstractAction result = new AbstractAction() {
      @Override
      public void actionPerformed( ActionEvent e ) {
        System.out.println( "MnemonicTest.actionPerformed" );
      }
    };
    result.putValue( Action.MNEMONIC_KEY, KeyEvent.VK_A );
    result.putValue( Action.NAME, "Action" );
    return result;
  }

  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        createUI().setVisible( true );
      }
    } );
  }
}
于 2012-04-30T08:02:54.427 に答える