2008-10-22 32 views
20

java.awt.Component.getName() được sử dụng để làm gì? Nó luôn luôn có vẻ là null trong các ứng dụng tôi xây dựng với NetBeans. Tôi đang nghĩ đến việc lưu trữ một số văn bản trợ giúp cho mỗi thành phần trong đó - Tôi không muốn sử dụng chú giải công cụ, tôi có một bảng điều khiển khác nơi tôi sẽ hiển thị văn bản trợ giúp.java.awt.Component.getName() và setName() được sử dụng để làm gì?

Trả lời

20

Component.setName (..) được sử dụng trong JDK chủ yếu là do cái nhìn và cảm nhận lớp thực hiện để thiết lập chuỗi ID giống như đối với từng thành phần, ví dụ BasicOptionPaneUI có thể gọi nó trên một thành phần nút để đặt tên của nó là "OptionPane.button".

Phương thức getName() được sử dụng trong phương thức toString() khi đặt tên các thành phần con bên trong thành phần Composite/parent và trong mã ghi nhật ký gỡ lỗi AWT và Swing. Tôi nghi ngờ mạnh mẽ rằng phương thức getName() cũng được sử dụng bởi một số khung kiểm tra AWT/Swing.

Vì vậy, nếu bạn không phải phụ thuộc vào bất kỳ trong những ứng dụng trên của getName(), bạn có thể thử sử dụng nó cho các thông điệp giúp đỡ của bạn, mặc dù tôi không muốn giới thiệu nó.

Có lẽ bạn nên xem xét lại thiết kế của mình? Sử dụng tên để thực hiện một số tra cứu trong một hashmap tải văn bản trợ giúp từ một gói tài nguyên?

+0

Cảm ơn Herman - hãy xem câu trả lời của tôi bên dưới về cách tôi đã làm điều đó. – JohnnyLambada

6

Tôi chưa từng thấy nó được sử dụng cho bất kỳ điều gì trong khuôn khổ. Nó hữu ích nếu bạn có các thành phần được truyền vào một phương thức để bạn có thể hỏi tên của họ để quyết định cách xử lý chúng. Ngoài ra, nhiều khung kiểm tra UI sử dụng điều này để cho phép bạn tham khảo các thành phần theo tên trong các kịch bản thử nghiệm. Tôi không thấy bất kỳ lý do gì bạn không thể sử dụng nó cho văn bản trợ giúp mặc dù.

+3

Chúng tôi sử dụng nó để thử nghiệm robot/UI. –

+1

Chúng tôi cũng sử dụng nó cho thử nghiệm robot/UI. – Jason

0

Ngoài ra, vì tôi nghĩ java.awt.Component là một đối tượng hạng nặng trong X, các chương trình như xwininfo và xwd có thể cho phép bạn chỉ định nó theo tên.

Tôi chỉ cố gắng nó với một JFrame, và setName không đặt tên của cửa sổ, cửa sổ được đặt tên bởi các chuỗi tôi trôi qua trong constructor. Nhưng tôi không có bất kỳ mã ví dụ điển hình nào để kiểm tra, vì vậy tôi có thể sai về những gì tôi đã viết ở trên.

1

Câu trả lời của Herman Lintvelt đã kết thúc là câu trả lời đúng cho ứng dụng của tôi.

Tôi tạo ra một bó tài nguyên tên HelpText.properties. Nó chứa các cặp name = value. Tôi setName() d từng thành phần của tôi với "tên" từ cặp name = value. Sau đó tôi sử dụng getGlassPane của khung() để chụp tất cả các chuyển động của chuột. Khi một con chuột chạy qua một thành phần được đặt tên, nó tìm kiếm tên trong gói, hiển thị trợ giúp nếu có sẵn và chuyển tiếp chuyển động chuột đến cùng với Thành phần thực tế.

Whew. Chỉ có 2 ngày giá trị dinking xung quanh. Cuối cùng tôi bắt đầu làm quen với

+0

Vui vì tôi có thể giúp. Hãy tận hưởng Java. –

2

Phương pháp component.getName() Java :) chủ yếu sử dụng với người nghe. Nếu bạn đặt tên của một thành phần (component.setName(name)), bạn có thể gọi đến thành phần cụ thể đó từ bên trong một phương thức của Listener.

Ví dụ:

public void someMethodOfsomeListener(SomeEvent e){ 
    if (e.getComponent().getName().equals(component.getName()) 
     //do stuff... 
} 

Hãy nhận biết rằng bạn phải thiết lập một cách rõ ràng tên của các thành phần, nếu không nó sẽ trở lại null.

+0

Nếu bạn có tham chiếu 'thành phần' trong trình nghe, bạn cũng có thể sử dụng' e.getComponent() == component' mà ít bị lỗi hơn. Tôi cũng sẽ cân nhắc việc sử dụng nhiều người nghe. – palacsint

+0

Các thành phần có thể có cùng tên. Đừng nhầm lẫn giữa các thử nghiệm trên cho bình đẳng thành phần. – Jason

0

Tôi sử dụng nó để xử lý người nghe trong một lớp đơn lẻ. Tôi nhận được như một tham số thành phần chứa object.addListener của tôi không phải là một container nhưng là lớp chứa đối tượng đó. Cảm ơn Vivavinyl vì mẹo đặt tên đầu tiên. Nó rất hữu ích và hiệu quả.

0

Đây là những gì tôi sử dụng getName() cho:

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 sử dụng tên của một thành phần để xác định nó trong testcases.

-1

Tôi đã tìm kiếm nhiều câu trả lời để nhận tên và tôi nghĩ rằng đây chỉ là giải pháp dễ dàng

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

Điều này không trả lời được câu hỏi nào cả? –

Các vấn đề liên quan