Для чего используются java.awt.Component.getName() и setName()?
Вопрос
Что такое java.awt.Component.getName()
используется для?Кажется, так будет всегда null
в приложениях, которые я создаю с помощью NetBeans.Я подумываю о том, чтобы сохранить в нем немного текста справки для каждого компонента - я не хочу использовать всплывающую подсказку, у меня есть другая панель, где я покажу текст справки.
Решение
Component.setName (..) используется в JDK главным образом классами реализации внешнего вида для установки идентичных строк для каждого компонента, например, BasicOptionPaneUI может вызвать его в компоненте кнопки, чтобы установить его имя на «OptionPane.button».
getName () используется в методах toString (), когда задаются имена дочерних компонентов внутри компонента Composite / parent, а также в коде отладки AWT и Swing. Я сильно подозреваю, что метод getName () также используется некоторыми средами тестирования AWT / Swing. Р>
Поэтому, если вы не зависите ни от одного из перечисленных выше способов использования getName (), вы можете попробовать использовать его для своих справочных сообщений, хотя я бы не рекомендовал его. Р>
Может быть, вам стоит пересмотреть свой дизайн? Использовать имя для поиска в хэш-карте, которая загружает текст справки из пакета ресурсов?
Другие советы
Я не видел, чтобы это использовалось для чего-либо в рамках. Это полезно, если у вас есть компоненты, передаваемые методу, чтобы вы могли спросить их имя, чтобы решить, как с ними обращаться. Кроме того, многие инфраструктуры тестирования пользовательского интерфейса используют это, чтобы позволить вам ссылаться на компоненты по имени в сценариях тестирования. Я не вижу причин, по которым вы не можете использовать его для справки.
FEST использует имя компонента для его идентификации в тестовых случаях.
Тот Самый component.getName()
метод в основном используется со слушателями.Если вы зададите имя компонента (component.setName(name)
) вы можете вызвать этот конкретный компонент из метода Listener
.
Пример:
public void someMethodOfsomeListener(SomeEvent e){
if (e.getComponent().getName().equals(component.getName())
//do stuff...
}
Имейте в виду, что вы должны явно указать имя компонента, в противном случае он вернет null
.
Ответ Германа Линтвельта оказался правильным для моего приложения.
Я создал пакет ресурсов с именем HelpText.properties.Он содержит пары имя=значение.Я устанавливаю name() для каждого из моих компонентов с помощью "name" из пары name=value .Затем я использовал getGlassPane() фрейма, чтобы фиксировать все движения мыши.Когда мышь проходит по именованному компоненту, она ищет название в пакете, отображает справку, если таковая имеется, и перенаправляет движение мыши к реальному Компоненту.
- Посмотри здесь о том, как пользоваться стеклянной панелью.
- Дом Джен Ньюмарч веб-страница по использованию пакетов ресурсов был очень полезен.
- Кевин Рифф ответ помог мне разобраться, как найти мой пакет ресурсов.
Фух.Стоит повозиться всего 2 дня.Я наконец-то начинаю привыкать к Java :)
Кроме того, поскольку я думаю, что java.awt.Component является тяжеловесным объектом в X, такие программы, как xwininfo и xwd, могут позволить вам указать его по имени.
Я только что попробовал это с JFrame, и setName не установил имя окна, окно было названо строкой, которую я передал в конструкторе. Но у меня нет примера кода, предназначенного только для AWT, чтобы протестировать его, поэтому я могу ошибаться в том, что написал выше.
Я использую это для обработки слушателей в одном отдельном классе. Я получаю в качестве параметра компонент, который содержит мой object.addListener не как контейнер, а как класс, содержащий этот объект. Спасибо Вивавинил за подсказку установки имени первым. Это было полезно и работало.
Это то, что я использую для 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;
}
}
Я искал много ответов для получения имени и я думаю, что это единственное простое решение
public static void main(String[] args) {
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
String name = actionEvent.getSource().toString();
UserReaction(ObjectName.getComponentVariableName(name), "null");
}
};
Button calculate_btn = new Button("Calculate");
calculate_btn.setName("Calculate");
calculate_btn.addActionListener(actionListener);
}
private static void UserReaction(String objectName) {
if (objectName.equals("Calculate")) {
//do something;
}
}static public String getComponentVariableName(String name) {
String res = (name.substring(name.indexOf("[") + 1));
res = res.split(",")[0];
return res;
}