Was ist java.awt.Component.getName()
für verwendet? Es scheint immer null
in den Anwendungen zu sein, die ich mit NetBeans erstelle. Ich denke daran, einen Hilfstext für jede Komponente darin zu speichern - ich möchte den Tooltip nicht verwenden, ich habe ein anderes Panel, in dem ich den Hilfetext anzeigen kann.Wofür werden java.awt.Component.getName() und setName() verwendet?
Antwort
Component.setName (..) wird im JDK hauptsächlich von den Look-and-Feel-Implementierungsklassen verwendet, um ID-artige Strings für jede Komponente, z. BasicOptionPaneUI könnte es auf einer Button-Komponente aufrufen, um seinen Namen auf "OptionPane.button" zu setzen.
Die Methode getName() wird in toString() -Methoden verwendet, wenn die Namen von untergeordneten Komponenten in einer Composite/parent-Komponente und im AWT- und Swing-Debugprotokollierungscode festgelegt werden. Ich vermute stark, dass die Methode getName() auch von einigen AWT/Swing-Test-Frameworks verwendet wird.
Wenn Sie also nicht von einer der oben genannten Verwendungen von getName() abhängig sind, könnten Sie versuchen, sie für Ihre Hilfemeldungen zu verwenden, obwohl ich dies nicht empfehlen würde.
Vielleicht sollten Sie Ihr Design überdenken? Verwenden Sie den Namen, um eine Suche in einer Hashmap durchzuführen, die den Hilfetext aus einem Ressourcenpaket lädt?
Ich habe nicht gesehen, dass es für irgendetwas durch das Rahmenwerk verwendet wurde. Es ist nützlich, wenn Sie Komponenten an eine Methode übergeben, so dass Sie ihren Namen fragen können, wie sie behandelt werden sollen. Darüber hinaus verwenden viele UI-Test-Frameworks dies, damit Sie in den Testskripts auf die Komponenten anhand des Namens verweisen können. Ich sehe keinen Grund, warum Sie es nicht für Hilfetext verwenden können.
Wir verwenden es für Roboter/UI-Tests. –
Wir verwenden es auch für Roboter/UI-Tests. – Jason
Auch, da ich denke, java.awt.Component ist ein Schwergewicht-Objekt in X, können Programme wie xwininfo und xwd können Sie es nach Namen angeben.
Ich habe es gerade mit einem JFrame versucht, und SetName hat den Namen des Fensters nicht festgelegt, das Fenster wurde durch die Zeichenfolge benannt, die ich im Konstruktor übergeben habe. Aber ich habe keinen awt-only-Beispielcode zum Testen, also könnte ich mich irren, was ich oben geschrieben habe.
Die Antwort von Herman Lintvelt war die richtige für meine App.
Ich habe ein Ressourcenpaket namens HelpText.properties erstellt. Es enthält Name = Wert-Paare. Ich setName() d jede meiner Komponenten mit dem "Name" aus dem Name = Wert-Paar. Ich habe dann getGlassPane() des Frames verwendet, um alle Mausbewegungen zu erfassen. Wenn eine Maus über eine benannte Komponente fährt, sucht sie den Namen im Bundle, zeigt Hilfe an, falls verfügbar, und leitet die Mausbewegung an die tatsächliche Komponente weiter.
- Suchen Sie here für die Verwendung der Glasscheibe.
- Jan Newmarch web page on using resource bundles war sehr hilfreich.
- Kevin Riffs response half mir herauszufinden, wie ich mein Ressourcenbündel finden kann.
Puh. Nur 2 Tage im Wert von herumtappen. Ich fange endlich an, mich an Java zu gewöhnen :)
Ich bin froh, dass ich helfen konnte. Genieße Java. –
Die component.getName()
Methode wird meistens mit Zuhörern verwendet. Wenn Sie den Namen einer Komponente festlegen (component.setName(name)
), können Sie diese spezifische Komponente aus einer Methode einer Listener
aufrufen.
Beispiel:
public void someMethodOfsomeListener(SomeEvent e){
if (e.getComponent().getName().equals(component.getName())
//do stuff...
}
Beachten Sie, dass Sie explizit den Namen der Komponente setzen müssen, sonst wird es null
zurück.
Wenn Sie den 'component'-Verweis im Listener haben, könnten Sie auch' e.getComponent() == component' verwenden, was weniger fehleranfällig ist. Ich würde auch mehrere Listener verwenden. – palacsint
Komponenten können denselben Namen haben. Verwechseln Sie den obigen Test nicht für die Komponentengleichheit. – Jason
Ich benutze es für die Behandlung von Zuhörern in einer einzigen Klasse auseinander. Ich erhalte als Parameter die Komponente, die meinen object.addListener nicht als Container enthält, sondern als die Klasse, die dieses Objekt enthält. Danke Vivavinyl für den Tipp, den Namen zuerst zu setzen. Es war nützlich und funktionierte.
Das ist, was ich benutze getName() für:
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;
}
}
FEST verwendet den Namen einer Komponente in Testfälle zu identifizieren.
Ich habe viele Antworten gesucht nach Namen bekommen und ich denke, dass dies die einzige einfache Lösung ist
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;
}
Das beantwortet die Frage überhaupt nicht? –
Danke Herman - siehe meine Antwort unten für wie ich es gemacht habe. – JohnnyLambada