2012-01-27 26 views
5
class Test extends JPanel implements MouseListener 
{ 
    private JButton b1, b2, b3, b4; 

    public Test() 
    { 
     setLayout (new GridLayout (2, 3)); 

     b1 = new JButton ("Button 1"); 
     b2 = new JButton ("Button 2"); 

     add (b1); 
     add (b2); 
    } 

    public void mousePressed (MouseEvent event) 
    { 
     if (event.getText() == b1.getText()) 
     { 
     } 
    } 
} 

Tôi đã tự hỏi nếu có một phương pháp trong lớp MouseListener hoặc JPanel cho phép tôi lấy văn bản của nút được nhấp. Cảm ơnLàm cách nào để nhận được văn bản của một nút trong Java?

+4

Sử dụng 'equals' thay vì' == 'để so sánh chuỗi. Có gì sai với cách bạn nhận được nó? –

+1

Nó nói rằng getText() không phải là một phương pháp trong java.awt.event.MouseEvent - là có một phương pháp tương tự trong MouseEvent mà trả về văn bản như thế? –

Trả lời

4

Hãy xem tại The MouseEvent api Có một phương pháp getSource() mà bạn có thể sử dụng mà trả về đối tượng mà sự kiện này xảy ra. Sau đó kiểm tra xem đối tượng đó có phải là một thể hiện của một nút hay không. Nếu đó là bạn có thể bỏ nó vào một loại nút và sau đó nhận được văn bản từ đó.

public void mousePressed (MouseEvent event){ 
    Object o = event.getSource(); 
    JButton b = null; 
    String buttonText = ""; 

    if(o instanceof JButton) 
    b = (JButton)o; 

    if(b != null) 
    buttonText = b.getText(); 

} 
+1

Tôi không chắc liệu kiểm tra b! = Null là cần thiết, bởi vì đối tượng null JButton không thể kích hoạt một sự kiện, tôi đoán vậy. Nếu tôi sai, xin hãy sửa tôi. – Benjamin

+1

@Benjamin cần f.e. nhận JBUtton từ Model, hoặc AbstractButton cả hai +1 – mKorbel

+0

@Benjamin Việc kiểm tra null là có đặc biệt cho trường hợp của mousePressed được sử dụng cho các thành phần khác nhau. Các thành phần khác có thể sử dụng phương pháp này để hoạt động như một bộ điều khiển cho các sự kiện chuột. Điều đó sẽ tùy thuộc vào nhà phát triển để quyết định. bạn cũng có thể giữ mọi thứ trong instanceof ban đầu nếu câu lệnh nếu bạn muốn. Tôi chỉ viết nó ra để đơn giản. – Sean

4

Bạn nên thử xem ActionListener và triển khai nó. Những hành động được sa thải, bất cứ khi nào bạn bấm vào một nút, đây là cách bạn nên làm việc:

class Test extends JPanel implements ActionListener { 
... 
    public Test() { 
     super(); 
     ... 
     b1 = new JButton("Button 1"); 
     ... 
     add(b1); 
     ... 
     b1.addActionListener(this); 
     ... 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
     System.out.println(((JButton) event.getSource()).getText()); 
     if (event.getSource() == b1) { 
      // do sth 
     } else if (event.getSource() == b2) { 
      // do sth else 
     } 
    } 
} 

Sau đó viết một phương pháp chính và thêm một trường hợp mới của Test bảng điều khiển để một JFrame và xem cách nó hoạt động.

Hướng dẫn có thể được tìm thấy trên các trang web sau đây: http://docs.oracle.com/javase/tutorial/uiswing/components/button.html

+1

Điều này đã hiệu quả! Cảm ơn :) –

+0

@Ryan Edward Dougherty :) [Chấp nhận] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) câu trả lời, nếu đó là một trong những bạn đang tìm kiếm. – Lion

0
import java.util.Arrays; 

import java.util.List; 

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) { 

//******************************************************** 

     String Hunt1 = evt.toString(); 
     Hunt1 = Hunt1.replaceAll("=", ","); 
     Hunt1 = Hunt1.replaceAll("]", ","); 
     String [] Hunt2 = Hunt1.split(","); 
     List Hunt3 = Arrays.asList(Hunt2); 
     String ButtonText = Hunt3.get(2).toString(); 
     System.out.println(ButtonText); } 

//******************************************************* 

Đây là cách tôi đã làm nó. Tôi đã tìm kiếm một cách để vượt qua tên nút ra một phương pháp để tôi có thể chạy xuống một phạm vi if(s==Button1){}else if(s==Button2){..... khoảng 12 nút.

Bắt tên nút tỏ ra khó khăn đối với tôi (tôi chỉ làm Java trong một ngày hoặc lâu hơn) vì vậy tôi đã đưa ra điều này để chuyển nhãn/văn bản ra một phương thức.

Đó là mã có thể được đặt trong phương pháp riêng của mình để sau khi bạn thực hiện nút của bạn thiết lập bạn chỉ có thể đi vào mỗi sự kiện nhấp chuột và dán

SendButtonLabel(evt.ToString()); 

sau đó vượt qua nó từ đó đến bạn nếu/sau đó phương pháp buttonlist

hoặc bất kỳ dự án nào của bạn cần mà không phải thực sự truy cập và mã hóa mọi thứ vào mỗi sự kiện nhấp chuột. Tôi cho rằng nó sẽ là có thể nếu bạn đang làm một dự án cụ thể để thiết lập IDE của bạn để tự động thêm lời gọi phương thức đó vào mỗi sự kiện click khi nó được tạo ra, nhưng tôi vẫn chưa tiến xa đến mức nào.

1

Điều này cũng khiến tôi phải lo lắng ... và đây là câu trả lời: không có phương thức .getText() cho Nút ... bạn muốn sử dụng .getLabel() Không phải là không gian tên thú vị?

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