Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Component.setName (..) используется в JDK главным образом классами реализации стиля для установки подобных ИДЕНТИФИКАТОРУ строк для каждого компонента, например, BasicOptionPaneUI мог бы назвать его на компоненте кнопки для определения его имени к "OptionPane.button".
getName () используется в toString () методы при определении имен дочерних компонентов в Составном/родительском Компоненте и в AWT и коде входа отладки Swing. Я подозреваю сильно, что getName () метод также используется некоторыми средами тестирования AWT/Swing.
Поэтому, если Вы не зависите ни от одного вышеупомянутого использования getName (), Вы могли бы попытаться использовать его для своих сообщений справки, хотя я не рекомендую это.
, Возможно, необходимо ли пересмотреть дизайн? Используйте имя, чтобы сделать некоторый поиск в hashmap, который загружает текст справки из пакета ресурса?
Я не видел, что это использовало для чего-либо платформой. Его полезное, если у Вас есть компоненты, передаваемые в к методу, таким образом, можно попросить, чтобы их имя решило, как обработать их. Кроме того, много сред тестирования UI используют это, чтобы позволить Вам обращаться к компонентам по имени в сценариях тестирования. Я не вижу оснований, Вы не можете использовать их для текста справки все же.
Кроме того, так как я думаю java.awt. Компонент является тяжелым объектом в X, программы как xwininfo и xwd могли бы позволить Вам определять его по имени.
я просто попробовал его JFrame, и setName не определял имя окна, окно назвала строка, которую я передал в конструкторе. Но у меня нет немного awt-только примера кода для тестирования с, таким образом, я мог быть неправ относительно того, что я записал выше.
Ответ Herman Lintvelt закончил тем, что был корректным для моего приложения.
я создал пакет ресурса по имени HelpText.properties. Это содержит name=value пар. Я setName () d каждый из моих Компонентов с "именем" от name=value пары. Я тогда использовал getGlassPane кадра () для получения всех движений мыши. Когда мышь работает на основе именованного компонента, она ищет имя в пакете, справка дисплеев при наличии и вперед движение мыши к фактическому Компоненту.
Ух. Ценность только 2 дней укорачивания вокруг. Я наконец начинаю привыкать к Java:)
Метод component.getName ()
в основном используется со слушателями. Если вы задаете имя компонента ( component.setName (name)
), вы можете вызвать этот конкретный компонент из метода Listener
.
Пример:
public void someMethodOfsomeListener(SomeEvent e){
if (e.getComponent().getName().equals(component.getName())
//do stuff...
}
] Имейте в виду, что вы должны явно указать имя компонента, иначе он вернет null
.
Я использую его для обработки слушателей в одном классе отдельно. Я получаю в качестве параметра компонент, который содержит мой объект. AddListener не как контейнер, а как класс, содержащий этот объект. Спасибо Vivavinyl за подсказку о том, как сначала установить имя. Это было полезно и сработало.
Вот для чего я использую getName ():
Frame[] frames = JFrame.getFrames();
for (int i = 0; i < frames.length; ++i) {
//get the frame
Frame frame = frames[i];
if (frame.getName().equals(frameName)) {
//make the frame visible
frame.setVisible(true);
//focus the frame
frame.requestFocus();
//found
return;
}
}