2015-06-18 3 views
1

Я не мог найти ответ нигде в Интернете, поэтому я приехал сюда. Я заранее извиняюсь, если ошибка в моем коде очень очевидна; Я по-прежнему новичок в java swing. Вот что происходит: я создал JButton с именем toggleElevators, и я хочу, чтобы он менял текст при нажатии. Я уже создал ActionListener и добавил его в toggleElevators. Все, что я хочу прямо сейчас, это то, что JButton меняет текст при нажатии с Click me на Clicked.JButton ActionListener не отвечает

Во-первых, вот картина того, что фрейму выглядит при выполнении:

JFrame

Примечание: Существует третий класс, но это чисто для рисования картины на левой стороне. Это не имеет никакого отношения к GridLayout или JButton.

Run класс (созданный кадр и добавляет toggleElevators JButton:

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 

import javax.swing.JFrame; 

public class Run extends Input{ 

Input i = new Input(); 

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

public Run() { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame frame = new JFrame("Elevators"); 
      frame.setLayout(new GridLayout(0, 3)); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(new Elevators(Color.MAGENTA, true)); 
      frame.add(new Elevators(Color.ORANGE, false)); 
      frame.setSize(800,600); 
      frame.setResizable(false); 

      frame.getContentPane().add(toggleElevators); //adds toggleElevators button to JFrame 
      i.addButtonListeners(); //calls method defined in Input class, which adds the ActionListener to the toggleElevators button 

      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    }); 
} 

} 

Input класс (создает toggleElevators JButton и его ActionListener):

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 

public class Input { 
JButton toggleElevators = new JButton("Click me."); 

public void addButtonListeners() { 
    toggleElevators.addActionListener(new toggleElevatorsListener()); 
} 

class toggleElevatorsListener implements ActionListener { 
    public void actionPerformed (ActionEvent event) { 
     toggleElevators.setText("Clicked."); 
     System.out.println("ActionListener called."); //I know the ActionListener is not being called because this line is not being printed out in the console 
    } 
} 
} 
+0

Почему вы усложняете ситуацию? Почему вы не добавляете 'ActionListener' в' JButton' напрямую? – nom

+0

@NabeelOmer Это то, что вызывает проблему? Создал внутренний класс для ActionListener? Я не думал, что это что-то сделает. – Nick

+0

Я сейчас не рядом с компьютером (черт возьми, сейчас здесь 4 часа ночи), но вы усложняете вещи, создавая отдельный класс для 'ActionListener', добавляя его прямо к' JButton'. И – nom

ответ

1

Ваш класс Run расширяет вход, но и имеет вход с именем i. Вы добавляете this.toggleElevators к кадру, но вы добавляете слушателя к i.toggleElevators.

Удалите поле i со своего класса. Я также полностью забуду об определении и расширении класса Input. Это не служит никакой цели и, кажется, путает больше, чем поможет вам.

+0

Спасибо.Я полностью забыл, что в моем коде упоминались в основном отдельные экземпляры кнопки «toggleElevators». Я следовал вашим советам и удалял объект 'i', и это сработало. Еще раз спасибо за ваше время! – Nick

0

Вы создаете в своем классе Run новый Input, в то время как Run класс также расширяет Input.

При вызове i.addButtonListeners(); слушатели действий добавляются на toggleElevators из i, а не на toggleElevators вы унаследовали от Input класса.

Пробег: addButtonListeners().

+0

Просто подумал об этом сам. Спасибо в любом случае за ваше время! – Nick

0

Ваш Run класс распространяется Input. Поэтому он имеет свой собственный toggleElevators, который он устанавливает в кадре. Однако i имеет собственный toggleElevators, где он устанавливает прослушиватели событий. Таким образом, они не установлены на одном в кадре, но на том, который никогда не используется.

Вы можете просто удалить объект i. Поскольку Run extends Input, он может вызвать метод напрямую, а затем слушатель будет добавлен к своему toggleElevators.

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