2014-02-07 6 views
1

Я делаю программу сохранения stat, чтобы практиковать свои навыки графического интерфейса пользователя на Java.Ввод JButtons в стек

У меня есть программа, которая записывает статистику баскетболистов, нажимая JButton под их именем. Затем он добавляет статистику к текущему итогу и обновляет табло.

Настало время для меня, чтобы создать кнопку отмены.

Таким образом, каждый раз, когда действие выполняется, я добавляю кнопку источника в стек JButtons. Существуют некоторое литье участвует, так что в конце концов, как это:

JButton source = (JButton) e.getSource(); 
theStack.push(source); 

Позже, в методе actionPerformed я пытаюсь позвонить по функции отмены:

if(source.getText().equals("Undo")){ 
    System.out.println("Undo"); 
    JButton last = this.theStack.pop(); 
    System.out.println(last.getText()); //Works fine. 
    System.out.println(last.getName()); //Produces a null value. 
    int player = Integer.parseInt(last.getName().trim()); 
    undo(player, last.getText(), activePlayers); 
} 

Почему я получаю нуль для имя. Eclipse бросает исключение, когда пытается преобразовать имя в int, потому что оно преобразует нулевое значение. Я использую .getName() в других частях actionPerformed, но не здесь?

Мое имя, код настройки, сделано много раз в цикле for.

output[i][j] = new JButton("Make Two Points"); 
output[i][j].setName(i + ""); 

Проблема в простейшей форме.

public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 
     ArrayList<Integer> activePlayers = new ArrayList<Integer>(); 
     activePlayers.add(player0Select.getSelectedIndex()); 
     activePlayers.add(player1Select.getSelectedIndex()); 
     activePlayers.add(player2Select.getSelectedIndex()); 
     activePlayers.add(player3Select.getSelectedIndex()); 
     activePlayers.add(player4Select.getSelectedIndex()); 

     JButton source = (JButton) e.getSource(); 
     theStack.push(source); 

     if(source.getText().equals("Make Two Points")){ 
      this.makeTwoPoints(source.getName(), activePlayers); //source.getName() works here. 
      System.out.println("Two Points"); 
     } 
     if(source.getText().equals("Undo")){ 
      System.out.println("Undo"); 
      JButton last = this.theStack.pop(); 
      System.out.println(last.getText()); 
      System.out.println(last.getName()); //last.getName() produces null here. 
      int player = Integer.parseInt(last.getName().trim()); 
      undo(player, last.getText(), activePlayers); 
     } 
} 

ответ

1

Потому что вы никогда не ставили имя JButton, и Вы не должны. Каждый компонент имеет свойство name, которое может быть установлено с помощью метода setName(...), и если метод setter никогда не вызывается, то это имя равно null. Но каково значение этого свойства? Здесь не так много.

Если бы это был мой проект, я бы не собирал JButtons, а скорее собирал бы объекты модели или, возможно, элементы управления (действия). Давайте не будем смешивать наши модели с нашими взглядами.


Редактировать

Для простого примера того, что я имею в виду,

Вы могли бы StatAction перечисления, которые имели свои три (или больше статистических действий), например,

public enum StatAction { 
    MAKE_2_PTS("Make Two Points"), MISS_2_PTS("Miss Two Points"), 
    MAKE_3_PTS("Make Three Points"); 

    private String text; 

    private StatAction(String text) { 
     this.text = text; 
    } 

    @Override 
    public String toString() { 
    return text; 
    } 

    public String getText() { 
     return text; 
    } 

} 

И у вас может быть класс Player, который может включать в себя поле имени, а также List<StatAction>, например, он может иметь ...

public class Player { 
    private String name; 
    private List<StatAction> statActionList = new ArrayList<>(); 

    // .... 

    public String getName() { 
     return name; 
    } 

    public void addStatAction(StatAction statAction) { 
     statActionList.add(statAction); 
    } 

    public void removeStatAction(StatAction statAction) { 
     statActionList.remove(statAction); 
    } 

    public void removeLastStatAction() { 
     if (statActionList.size() > 0) { 
     statActionList.remove(statActionList.size() - 1); 
     } 
    } 

    //..... 

} 

И затем отменить можно удалить последний StatAction из списка Игрока. Отображение статистики может затем изменяться «на лету» через слушателей.

+0

Я установил их, когда я их сгенерировал, имя соответствует номеру столбца, который он привязывает к активному игроку в моей программе. –

+0

@TrevorHutto: JVM говорит вам иначе, и я верю в JVM. Пожалуйста, покажите свой код настройки. –

+0

@TrevorHutto: вам нужно будет создать и опубликовать тестовый [mcve] (http://stackoverflow.com/help/mcve), чтобы мы могли полностью понять вашу проблему. –