Мнемоника (подчеркнутые буквы) во всплывающих меню в Java Swing в Windows XP
У меня возникли некоторые проблемы с отображением подчеркиваний для отображения мнемоники в контекстных меню в приложении Java Swing, работающем в Windows XP.
Если щелкнуть правой кнопкой мыши, во всплывающем меню подчеркивания не отображаются - это нормально, так как такое поведение согласуется с другими приложениями Windows.
Но если вызвать всплывающее меню с помощью клавиши меню (обычно рядом с правой клавишей Windows), подчеркивания не отображаются для моего приложения Swing, тогда как они отображаются для стандартных приложений Windows, таких как Wordpad, Explorer и Панель управления.
Единственный способ показать подчеркивание - удерживать клавишу Alt, щелкая правой кнопкой мыши. Это бесполезно, потому что, если кто-то уже щелкнул правой кнопкой мыши, он не захочет использовать клавиатуру для выбора чего-либо во всплывающем окне.
Можно ли получить подчеркивание для отображения в Swing, когда контекстное меню вызывается из клавиши меню? Не написав свою собственную библиотеку Look & Feel?
1 ответ
Хороший вопрос. Я только что попробовал это на OS X, и я не получаю подчеркнутые буквы также. Как и вы, я получаю их, нажимая кнопку alt (не во время щелчка, а когда отображается мое всплывающее меню).
Тем не менее, на OS X I не могу вспомнить ни одно всплывающее окно, которое содержит подчеркнутые буквы. Я только что проверил некоторые приложения по умолчанию, и ни у одного из них нет всплывающего меню с подчеркнутыми элементами. Быстрый поиск в Google также показал это. Так что в этом случае внешний вид соответствует ОС.
После еще одного приближения к поиску я обнаружил следующую тему, в которой предполагается, что в Windows есть возможность скрыть мнемонику по умолчанию и показывать ее только при нажатии клавиши alt (которую нужно нажать в любом случае, чтобы использовать мнемонику, если я правильно помню из мои окна дней). Вы можете попробовать это.
Во всяком случае, вот SSCCE, позволяющий пользователям Windows быстро проверить это:
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 );
}
} );
}
}