2013-05-29 7 views
0

У меня проблема. Я создал игру. Когда я его открываю, я должен нажать ENTER, чтобы начать игру (просто введите). Теперь я обновил игру с помощью одной кнопки «EXIT GAME». Я не знаю, почему мой ключ ввода больше не работает из-за этой кнопки. Если я удалю его, тогда я могу снова нажать Enter и сыграть в игру.Включить событие мыши только через jbutton - Отключить событие клавиатуры для jbutton

Я должен только нажать нажатие на эту кнопку или что-то вроде этого? Пожалуйста, помогите мне.

public class LeftPanel extends JPanel implements ActionListener { 
    JButton ExitGame; 

    public LeftPanel(Tetris tetris) { 
     this.tetris = tetris; 
     setPreferredSize(new Dimension(400, 480)); 
     setBackground(Color.getHSBColor(17f, 0.87f, 0.52f)); 
     add(new JButton("Exit Game")); 
     { 
      ExitGame.addActionListener(this); 
     } 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.exit(0); 
    } 
} 
+0

Я думаю, что это опечатка 'add (new new..', и она должна быть чем-то' add (ExitGame) 'убедитесь, что вы ее инициализировали иначе, иначе она будет бросать NPE. – Smit

+0

' ExitGame.addActionListener (this); 'Вы получили здесь« NullPointerException »? – johnchen902

+0

@ johnchen902 Я не получил исключение NullPointerException. Как это сделать? – WPguy

ответ

2

Задача 1 - JButton единственный фокусируемый компонент в интерфейсе. Поэтому, когда вы запускаете программу, она получает фокусы по умолчанию. Хотя он имеет фокус по умолчанию. Он будет потреблять Введите ключевых штрихов.

Задача 2 - JPanel не поддается фокусировке, а это означает, что она никогда не сможет получить фокус на основной панели. Из вашего описания, я предполагаю, что вы используете KeyListener, что приводит к

Задача 3 - Использование KeyListener ... KeyListener будет реагировать только на ключевые события, когда компонент он зарегистрирован в фокусирования и имеет фокус. Вы можете это сделать, используя Key Bindings.

... Решения ...

  • Использование JLabel вместо JButton. Это потребует, чтобы вы зарегистрировали MouseListener на этикетке, чтобы получить уведомление о щелчках мыши, но он не будет отвечать на ключевые события ...
  • Еще лучше добавить кнопку «Старт» ...
+0

+1, мне нравится кнопка «Пуск». Это лучший пользовательский интерфейс, так как Пользователь будет знать, что происходит при нажатии кнопки или нажатии кнопки. – camickr

+0

Если вы собираетесь спускать вниз, будьте добрыми и укажите, почему мы можем узнать и, возможно, обновить ответ – MadProgrammer

0

Поскольку ActionlListener может запускаться как с помощью мыши, так и с клавиатуры, но теперь пользователь хочет только реагировать на событие мыши, поэтому измените прослушиватель действий на mouselistener. Протестировано и прошло.

public class LeftPanel extends JPanel implements ActionListener { 
    JButton ExitGame; 

    public LeftPanel(Tetris tetris) { 
     this.tetris = tetris; 
     setPreferredSize(new Dimension(400, 480)); 
     setBackground(Color.getHSBColor(17f, 0.87f, 0.52f)); 
     ExitGame= new JButton("Exit Game") 
     add(ExitGame); 
     ExitGame.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent e) { 
       System.exit(0); 
      } 
     }); 
    } 

}

+0

Это не остановит 'JButton' от ответа на ввод ключа, и это вообще не хорошая идея. 'JButton' использует' ActionListener' для событий мыши и ключа – MadProgrammer

+0

-1 JButton был разработан для использования с ActionListener, а не с MouseListener. – camickr

+0

Я не знаю, кто сказал, что JButton был разработан для использования с ActionListener; и я также хочу, чтобы вы протестировали мой код, прежде чем добавлять комментарии. – Stony

1

Вы можете попробовать:

public class LeftPanel extends JPanel implements ActionListener { 


    public LeftPanel(Tetris tetris) { 
     this.tetris = tetris; 
     setPreferredSize(new Dimension(400, 480)); 
     setBackground(Color.getHSBColor(17f, 0.87f, 0.52f)); 
     JButton ExitGame = new JButton("Exit Game"); 
     ExitGame.addActionListener(this); 
     ExitGame.setActionCommand("Exit"); 
     add(ExitGame); 

    } 

    public void actionPerformed(ActionEvent e) { 
     if("Exit".equals(e.getActionCommand()) 
      System.exit(0); 
    } 
} 
+0

Хотя он делает код чистым (и, вероятно, работает), он не решает проблему кнопки, потребляющей ключ ввода, который OP хочет использовать для начала игры – MadProgrammer

1

Эта строка выглядит как ошибка синтаксиса:

add(new JButton("Exit Game")); 
    { 
     ExitGame.addActionListener(this); 
    } 

Я думаю, что это должно быть что-то вроде этого:

ExitGame= new JButton("Exit"); 
this.add(ExitGame); 
ExitGame.addActionListener(this); 

Я не проверял это, но я думаю, что с некоторой настройкой вы сможете заставить его делать то, что вы хотите. Надеюсь, что все работает!

-Frank

+0

Пока он делает код чище (и, вероятно, работает) он не решает проблему кнопки, потребляющей ключ ввода, который OP хочет использовать для начала игры – MadProgrammer

+0

А хорошая точка. Глядя на ваш ответ, возможно, OP может сделать кнопку выхода, чтобы включить ее, поскольку это единственный элемент, на котором можно сосредоточиться. Поэтому изначально это была бы кнопка запуска, а затем после нажатия клавиши ввода, изменяя функциональность кнопки до кода выхода. Думаю, вам нужно установить какую-то булевскую переменную, чтобы проверить это. Только один способ сделать это. –

+0

Это неплохая идея ... – MadProgrammer

1
public void actionPerformed(ActionEvent e) { 
    if("Exit".equals(e.getActionCommand()) 

System.exit (0); }

+0

Можете вы хотя бы дать объяснение вашему ответу? – eliasah

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