2016-02-12 2 views
1

У меня есть JFrame с JMenuBar и JMenus в нем. Когда я запускаю рамку, я хочу, чтобы фокус был установлен в JMenu, поэтому, когда я нажму кнопку space, он отобразит его пункты меню.Как установить фокус на JMenu?

это все не работает

mnNewMenu_1.requestFocus(); 
mnNewMenu_1.grabFocus(); 
mnNewMenu_1.requestFocusInWindow(); 

Как сделать фокус по умолчанию, установленный на JMenu, когда приложение запускается?

Вот источники:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JMenuBar; 
import javax.swing.JMenu; 
import javax.swing.JMenuItem; 
import javax.swing.JButton; 

@SuppressWarnings("serial") 
public class GUIsds extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
        GUIsds frame = new GUIsds(); 
        frame.setVisible(true); 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public GUIsds() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 

     JMenuBar menuBar = new JMenuBar(); 
     setJMenuBar(menuBar); 

     JMenu mnNewMenu = new JMenu("New menu"); 
     menuBar.add(mnNewMenu); 

     JMenuItem mntmNewMenuItem = new JMenuItem("New menu item"); 
     mnNewMenu.add(mntmNewMenuItem); 

     JMenu mnNewMenu_1 = new JMenu("New menu2"); 
     menuBar.add(mnNewMenu_1); 

     JMenuItem mntmNewMenuItem_1 = new JMenuItem("New menu item2"); 
     mnNewMenu_1.add(mntmNewMenuItem_1); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JButton btnNewButton = new JButton("New button"); 
     contentPane.add(btnNewButton, BorderLayout.SOUTH); 
    } 
} 
+0

Куда вы пытаетесь вызвать эти методы? – Ferrybig

+0

@Ferrybig после menuBar.add (mnNewMenu_1); – VextoR

+0

Можете ли вы попытаться сделать это в конце конструктора? Возможно, они требуют действительного кадра, прежде чем они будут иметь какой-либо эффект. – Ferrybig

ответ

2

Вы должны убедиться, что кадр виден, прежде чем пытаться отобразить меню. Так что вы можете попробовать что-то вроде:

SwingUtilities.invokeLater(new Runnable() 
{ 
    public void run() 
    { 
     mnNewMenu_1.doClilck(); 
    } 
}); 
0

После того, как вы установите фокус на раме (в других случаях я supose родительской панели или Componect будет работать), ПРОСТРАНСТВО больше не активирует кнопку:

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
       GUIsds frame = new GUIsds(); 
       frame.setVisible(true); 
       frame.setFocusable(true); //added this 
     } 
    }); 
} 

После этого вы можете добавить KeyListener к раме в конце GUIsds(), чтобы иметь меню показать:

this.addKeyListener(new KeyAdapter() { 
     public void keyPressed(KeyEvent e) { 
      int key = e.getKeyCode(); 

      if (key == KeyEvent.VK_SPACE) { 
       System.out.println("SPACE"); 
       mnNewMenu_1.doClick(); 
      } 
      } 
     } 
    ); 

в качестве альтернативы, как много Simp Лер решение, если вы не возражаете, нажав Alt + ПРОСТРАНСТВО вы можете использовать setMnemonic() внутри GUIsds():

mnNewMenu_1.setMnemonic(KeyEvent.VK_SPACE); 
Смежные вопросы