2008-10-22 10 views

Antwort

20

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?

+0

Danke Herman - siehe meine Antwort unten für wie ich es gemacht habe. – JohnnyLambada

6

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.

+3

Wir verwenden es für Roboter/UI-Tests. –

+1

Wir verwenden es auch für Roboter/UI-Tests. – Jason

0

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.

1

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.

Puh. Nur 2 Tage im Wert von herumtappen. Ich fange endlich an, mich an Java zu gewöhnen :)

+0

Ich bin froh, dass ich helfen konnte. Genieße Java. –

2

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.

+0

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

+0

Komponenten können denselben Namen haben. Verwechseln Sie den obigen Test nicht für die Komponentengleichheit. – Jason

0

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.

0

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; 

     } 

    } 
2

FEST verwendet den Namen einer Komponente in Testfälle zu identifizieren.

-1

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; 
} 
+0

Das beantwortet die Frage überhaupt nicht? –