2015-11-20 1 views
0

Во-первых, я знаю, как добавить Введите горячую клавишу со следующим кодом:Как добавить горячую клавишу Войдите в класс JPanel?

JPanel panel = new JPanel(); 
//... 
JButton button = new JButton("Execute"); 
panel.getRootPane().setDefaultButton(button); // Hotkey "Enter" by default 
// ... 
panel.add(button); 

Но в этом случае, следующий код ниже

class LeftPanel extends JPanel 
{ 
    LeftPanel() 
    { 
     setLayout(null); 
     setBounds(2, 42, 146, 252); 

     button(); 
    } 

    void button() 
    {  
     JButton exebutton = new JButton("Execute"); 
     //getRootPane().setDefaultButton(exebutton); // Hotkey "Enter" by default 
     exebutton.setMnemonic(KeyEvent.VK_ENTER); // Shortcut: Alt + Enter 
     exebutton.setBounds(4, 18, 138, 47); 
     add(exebutton); 
    } 
} 

Как добавить Enter горячие клавиши? getRootPane().setDefaultButton(exebutton); не работает. Я получил сообщение об ошибке:

Исключение в потоке "главный" java.lang.NullPointerException

Это мой кадр класс

public class MyFrame extends JFrame 
{ 
    MyFrame() 
    { 
     setTitle("Frame Test"); 
     setSize(400, 200); 
     setLayout(null); 

     LeftPanel leftpanel = new LeftPanel(); 
     add(leftpanel); 

     setVisible(true); 
     setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE); 
    } 
} 

и мой главный

public static void main(String[] args) 
{ 
    new MyFrame(); 
} 

Alt+Enter ярлык произведение, но не Enter.

ответ

3

Добавьте getRootPane().setDefaultButton(exebutton); в классе MyFrame как этот

public class MyFrame extends JFrame 
{ 
    MyFrame() 
    { 
     setTitle("Frame Test"); 
     setSize(400, 200); 
     setLayout(null); 

     LeftPanel leftpanel = new LeftPanel(); 
     add(leftpanel); 
     getRootPane().setDefaultButton(leftpanel.getDefaultBtn()); 

     setVisible(true); 
     setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE); 
    } 
} 

Убедитесь, что вы можете получить доступ к JButton, объявив его перед любым из способов, как так

class LeftPanel extends JPanel 
{ 
    JButton exeButton; 

    LeftPanel() 
    { 
     setLayout(null); 
     setBounds(2, 42, 146, 252); 

     button(); 
    } 

    void button() 
    {  
     exebutton = new JButton("Execute"); 
     exebutton.setMnemonic(KeyEvent.VK_ENTER); // Shortcut: Alt + Enter 
     exebutton.setBounds(4, 18, 138, 47); 
     add(exebutton); 
    } 

    public JButton getDefaultBtn() 
    { 
     return exebutton; 
    } 
} 
+0

спасибо. Я замечаю, что компилятор мне тоже просит объявить JButton слишком –

+0

Нет проблем! Рад был помочь. :) – Jonah

+1

@LordRixuel, вы должны создать метод, если хотите получить доступ к кнопке за пределами панели, не обращайтесь к переменной класса непосредственно. – camickr

4

Вы не можете установить по умолчанию в конструкторе вашего класса LeftPanel, потому что панель еще не добавлена ​​в JFrame, поэтому она не знает, что такое корневая панель.

Так что в вашем LeftPanel вам нужно сделать несколько вещей:

  1. Сделайте свой «execButton» переменную экземпляра, а не локальная переменная.
  2. Создайте метод как getDefaultButton(), который просто вернет переменную экземпляра.

Теперь в вас код при создании кадра вы можете установить кнопку по умолчанию:

LeftPanel leftpanel = new LeftPanel(); 
add(leftpanel); 
getRootPane().setDefaultButton(leftPanel.getDefaultButton()); 

Кроме того, избавиться от всех нулевых раскладок в вашем коде. Swing был разработан для использования с менеджерами компоновки.

Смежные вопросы