2016-11-05 2 views
1

Я пытаюсь получить свойство клиента на SpanButton при нажатии. Это бросает исключение NullPointerException.Свойство клиента SpanButton throws NullPointerException

Я тестировал один и тот же код с помощью обычной кнопки, и он работает нормально. Я считаю, что там может быть ошибка.

Вот как вы можете воссоздать этот вопрос из проекта Barebone:

Form hi = new Form("Hi World"); 
    Button button = new Button("Button"); 
    button.putClientProperty("id", 100); 

    SpanButton spanButton = new SpanButton("SpanButton"); 
    spanButton.putClientProperty("id", 200); 

    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent evt) { 
      int id = (int) evt.getComponent().getClientProperty("id"); 
      System.out.println("Standard Button action listener: id = " + id); 
     } 
    }); 

    spanButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent evt) { 
      int id = (int) evt.getComponent().getClientProperty("id"); 
      System.out.println("Span button action listener: id = " + id); 
     } 
    }); 

    hi.addComponent(button); 
    hi.addComponent(spanButton); 
    hi.show(); 

Если нажать на кнопку, то выход напечатанной правильно:

Стандартный слушатель Кнопка Действие: ID = 100

Если вы нажмете на SpanButton, вы получите исключение NullPointerException. После расследования я узнал, что свойство getClientProperty (id) SpanButton возвращает null.

Примечание: Мне нужно использовать SpanButton из-за его поддержки переменных размеров.

ответ

1

Вместо getComponent() используйте метко названное getActualComponent().

JavaDocs объясняет, почему:

Идентичный ActionEvent#getComponent() за то, что свинцовый компонент будет возвращен, если такой свинцовый компонент доступен только.

Это важно для таких компонентов, как MultiButton, которые вместо этого возвращают базовую кнопку.

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