是java.awt.Component.getName()
用来做什么的?它似乎总是出现null
在我使用 NetBeans 构建的应用程序中。我正在考虑在其中为每个组件存储一些帮助文本——我不想使用工具提示,我有另一个面板,我将在其中显示帮助文本。
9 回答
Component.setName(..) 在 JDK 中主要由外观实现类使用来为每个组件设置类似 ID 的字符串,例如 BasicOptionPaneUI 可能会在按钮组件上调用它以将其名称设置为“OptionPane.button”。
getName() 在 toString() 方法中使用,当在复合/父组件内以及在 AWT 和 Swing 调试日志记录代码中设置子组件的名称时。我强烈怀疑某些 AWT/Swing 测试框架也使用 getName() 方法。
因此,如果您不依赖 getName() 的上述任何用法,您可以尝试将它用于您的帮助消息,尽管我不推荐它。
也许你应该重新考虑你的设计?使用该名称在从资源包加载帮助文本的哈希图中进行一些查找?
我还没有看到它被框架用于任何事情。如果您将组件传递给方法,那么它很有用,因此您可以询问它们的名称来决定如何处理它们。此外,许多 UI 测试框架使用它来允许您在测试脚本中按名称引用组件。不过,我看不出有任何理由不能将它用于帮助文本。
Herman Lintvelt 的答案最终成为我的应用程序的正确答案。
我创建了一个名为 HelpText.properties 的资源包。它包含名称=值对。我用 name=value 对中的“name”设置了我的每个组件。然后我使用框架的 getGlassPane() 来捕获所有鼠标移动。当鼠标在命名组件上运行时,它会在包中查找名称,显示帮助(如果可用)并将鼠标移动转发到实际组件。
- 在这里查看如何使用玻璃板。
- Jan Newmarch关于使用资源包的网页非常有帮助。
- Kevin Riff 的回复帮助我弄清楚了如何找到我的资源包。
唷。只有 2 天的用餐时间。我终于开始习惯 Java 了 :)
FEST使用组件的名称在测试用例中识别它。
该component.getName()
方法主要用于侦听器。如果您设置了组件的名称 ( component.setName(name)
),您可以从 a 的方法中调用该特定组件Listener
。
例子:
public void someMethodOfsomeListener(SomeEvent e){
if (e.getComponent().getName().equals(component.getName())
//do stuff...
}
请注意,您必须明确设置组件的名称,否则它将返回null
.
此外,由于我认为 java.awt.Component 是 X 中的重量级对象,因此 xwininfo 和 xwd 等程序可能允许您按名称指定它。
我只是用一个JFrame试了一下,setName没有设置窗口的名字,窗口是由我在构造函数中传入的字符串命名的。但是我没有任何仅 awt 的示例代码可供测试,所以我上面写的内容可能是错误的。
我用它来处理一个单独的类中的听众。我将包含我的 object.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;
}
}
我已经搜索了很多答案以获取名称,我认为这是唯一简单的解决方案
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;
}