2016-11-27 2 views
0

У меня проблема с этим кодом, он не компилируется. Не могли бы вы помочь мне ? мне нужно закрыть JFrame, когда я нажмите кнопкуЗакрытие JFrame с JButton

public class SlotMachine extends JFrame 
{ 
    /* 
    * 
    */ 
    JButton btnExit = new JButton("Exit"); 
    btnExit.addMouseListener(new MouseAdapter() 
    { 
     @Override 
     public void mouseClicked(MouseEvent arg0) 
     { 
      this.dispose(); 
     } 
    }); 
} 

Ошибка = метод Dispose() не определено для типа нового MouseAdapter() {}

Я не знаю, как получить объект Slotmachine от метода mouseClicked

+0

Если это не компиляция, и вы не знаете, почему, было бы целесообразно опубликовать полное сообщение об ошибке, не так ли? –

+0

Боковой вопрос: никогда не используйте MouseListener для этого - вместо этого добавьте ActionListener в JButton по нескольким причинам. –

+0

Избавьтесь от этого. Вот и все. Или укажите *, который * 'this' с' SlotMachine.this'. –

ответ

1

Вы звоните this.dispose(); ключ здесь в том, что this относится к внутреннему классу, в MouseListener и MouseListener не метод dispose().

Решение: избавиться от this, и он должен работать, поскольку компилятор тогда будет изучать внешний класс, если внутренний класс не содержит метод. В качестве альтернативы вы можете указать , который это означает: SlotMachine.this.dispose(); расскажет компилятору, чтобы вызвать метод внешнего класса SlotMachine.

Используйте ActionListener на JButton по нескольким причинам:

  • По умолчанию поведения кнопок должны быть активирован с помощью ПРОБЕЛА печати, если кнопка имеет фокус. Это не будет работать для MouseListener.
  • Также ожидается, что если кнопка отключена через setEnabled(false), то нажатие на нее не должно вызывать действие. Это не работает с MouseListener, но работает с ActionListener.
  • Вы можете легко разделить ActionListener (или, еще лучше, AbstractAction) с другими компонентами, включая JMenuItems.
+0

Спасибо, но даже если я использую ActionListener, мне нужно использовать SlotMachine.this.dispose()? – Yuri

+0

@Yuri: Да, конечно. Вы все еще используете анонимный внутренний класс. Или просто используйте 'dispose();' –

+0

Спасибо, я также изучил это в java-документе и знаю, что он работает :) – Yuri