WindowLookAndFeel

Status
Nicht offen für weitere Antworten.
G

Gast2

Gast
Hallo,

weiß jemand wie man beim WindowLookAndFeel ausschält, dass er bei der Alt Taste das Menü aktiviert?
 
G

Gast2

Gast
mhm... Also laut dem hier hat es ja was mit dem L&F zu tun. Also ich hab die ui property gesetzt !jetzt unterstreicht er mir die Mnemonic immer (so wie ich es will).
Aber jetzt reagiert die Alt taste noch. Sie aktiviert immer das Menü. In unsere Anwendung kann man wenn man alt gedrückt hält manche Sachen dragen und droppen und jedes mal wenn man alt löslässt aktiviert/deaktiviert das Menü total nervig ^^...

Windows Look and Feel Keyboard Navigation Hiding

Oder meinst du man es nicht beeinflussen wenn man alt drückt, dass das windows handelt?

EDIT:
Aber ich denke es liegt am L&F weil wenn ich ein anderes wähle(Metal) dann macht die Alt taste nichts am Menü
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Hier hab ich noch was gefunden die Frage ist nur wie ich es jetzt ausschalte ^^
Java:
public class WindowsRootPaneUI extends BasicRootPaneUI {

    private final static WindowsRootPaneUI windowsRootPaneUI = new WindowsRootPaneUI();
    static final AltProcessor altProcessor = new AltProcessor();

    public static ComponentUI createUI(JComponent c) {
	return windowsRootPaneUI;
    }

    static class AltProcessor implements KeyEventPostProcessor {
        static boolean altKeyPressed = false;
        static boolean menuCanceledOnPress = false;
        static JRootPane root = null;
        static Window winAncestor = null;

        void altPressed(KeyEvent ev) {
            MenuSelectionManager msm =
                MenuSelectionManager.defaultManager();
            MenuElement[] path = msm.getSelectedPath();
            if (path.length > 0 && ! (path[0] instanceof ComboPopup)) {
                msm.clearSelectedPath();
                menuCanceledOnPress = true;
                ev.consume();
            } else if(path.length > 0) { // We are in ComboBox
                menuCanceledOnPress = false;
                WindowsLookAndFeel.setMnemonicHidden(false);
                WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor);
                ev.consume();
            } else {
                menuCanceledOnPress = false;
	        WindowsLookAndFeel.setMnemonicHidden(false);
                WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor);
                JMenuBar mbar = root != null ? root.getJMenuBar() : null;
                if(mbar == null && winAncestor instanceof JFrame) {
                    mbar = ((JFrame)winAncestor).getJMenuBar();
                }
                JMenu menu = mbar != null ? mbar.getMenu(0) : null;
                if(menu != null) {
                    ev.consume();
                }
            }
        }

        void altReleased(KeyEvent ev) {
            if (menuCanceledOnPress) {
	        WindowsLookAndFeel.setMnemonicHidden(true);
                WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor);
                return;
            }

            MenuSelectionManager msm =
                MenuSelectionManager.defaultManager();
            if (msm.getSelectedPath().length == 0) {
                // if no menu is active, we try activating the menubar

                JMenuBar mbar = root != null ? root.getJMenuBar() : null;
                if(mbar == null && winAncestor instanceof JFrame) {
                    mbar = ((JFrame)winAncestor).getJMenuBar();
                }
                JMenu menu = mbar != null ? mbar.getMenu(0) : null;

                if (menu != null) {
                    MenuElement[] path = new MenuElement[2];
                    path[0] = mbar;
                    path[1] = menu;
                    msm.setSelectedPath(path);
                } else if(!WindowsLookAndFeel.isMnemonicHidden()) {
                    WindowsLookAndFeel.setMnemonicHidden(true);
                    WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor);
                }
            } else {
                if((msm.getSelectedPath())[0] instanceof ComboPopup) {
                    WindowsLookAndFeel.setMnemonicHidden(true);
                    WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor);
                }
            }

        }

        public boolean postProcessKeyEvent(KeyEvent ev) {
            if(ev.isConsumed()) {
                // do not manage consumed event
                return false;
            }
            if (ev.getKeyCode() == KeyEvent.VK_ALT) {
                root = SwingUtilities.getRootPane(ev.getComponent());
                winAncestor = (root == null ? null : 
                        SwingUtilities.getWindowAncestor(root));

                if (ev.getID() == KeyEvent.KEY_PRESSED) {
                    if (!altKeyPressed) {
                        altPressed(ev);
                    }
                    altKeyPressed = true;
                    return true;
                } else if (ev.getID() == KeyEvent.KEY_RELEASED) {
                    if (altKeyPressed) {
                        altReleased(ev);
                    } else {
                        MenuSelectionManager msm =
                            MenuSelectionManager.defaultManager();
                        MenuElement[] path = msm.getSelectedPath();
                        if (path.length <= 0) {
                            WindowsLookAndFeel.setMnemonicHidden(true);
                            WindowsGraphicsUtils.repaintMnemonicsInWindow(winAncestor);
                        }
                    }
                    altKeyPressed = false;
                }
                root = null;
                winAncestor = null;
            } else {
                altKeyPressed = false;
            }
            return false;
        }
    }
}
 
G

Gast2

Gast
Sooooodele happy hacking ist vorbei :D...

Lösung eigener FocusManager

Java:
	public static class WindowFocusManager extends DefaultKeyboardFocusManager {
		public void addKeyEventPostProcessor(KeyEventPostProcessor processor) {
			if (processor.getClass().getName().indexOf(
					"WindowsRootPaneUI$AltProcessor") != -1)
				return;
			super.addKeyEventPostProcessor(processor);
		}
	}

WICHTIG!!! Vor dem setzen des LookAndFeels machen sonst überbügelt man den UIFocusManager
Java:
KeyboardFocusManager.setCurrentKeyboardFocusManager(new WindowFocusManager());

Und im UIManager das hier noch setzen "Button.showMnemonics", Boolean.TRUE
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G WindowLookAndFeel AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen


Oben