2009-09-03 59 views
5

có cách nào, trong Java, trực tiếp kiểm tra xem một trong các nút chuột có bị tắt mà không sử dụng sự kiện, trình nghe, v.v. không? Tôi muốn có một chủ đề, cứ 100 mili giây hoặc lâu hơn, kiểm tra xem nút chuột có bị hỏng hay không và sau đó thực hiện điều gì đó. Vì vậy, nếu người dùng giữ nút chuột xuống trong một thời gian, nó sẽ kích hoạt một số phản hồi.Nhấn chuột Java - không có sự kiện

Vì vậy, những gì tôi đang tìm kiếm là một phương pháp mang lại trạng thái của con chuột mà không phải trải qua hệ thống xử lý sự kiện thông thường.

cảm ơn

+4

Xin lỗi, nhưng ... tại sao? –

Trả lời

4

Tôi tin rằng điều này là không thể trong Java. Cũng có thể thông qua JNI nhưng đó là một thế giới của đau đớn.

Thực hiện việc này với các sự kiện không khó và sẽ tích hợp tốt hơn với phần còn lại của ứng dụng. Dưới đây là một ví dụ về văn bản cho giao diện điều khiển mỗi 100 ms trong khi nút chuột được nhấn:

import javax.swing.*; 
import java.awt.event.*; 

public class Test { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     final JLabel label = new JLabel("Click on me and hold the mouse button down"); 
     label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     frame.getContentPane().add(label); 
     label.addMouseListener(new TimingMouseAdapter()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private static class TimingMouseAdapter extends MouseAdapter { 
     private Timer timer; 

     public void mousePressed(MouseEvent e) { 
      timer = new Timer(100, new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Mouse still pressed..."); 
       } 
      }); 
      timer.start(); 
     } 

     public void mouseReleased(MouseEvent e) { 
      if (timer != null) { 
       timer.stop(); 
      } 
     } 

    } 
} 

Sửa đổi này để làm những việc khác nhau (chẳng hạn như thay đổi chế độ cọ) sau một thời gian khác nhau thời gian nên thẳng về phía trước.

+0

Wow, cảm ơn. Tôi sẽ thử sử dụng tính giờ, sau đó. –

4

Tôi không biết điều này có khả thi hay không - có thể vậy.

Tuy nhiên, bạn luôn có thể viết trình xử lý sự kiện có công việc duy nhất là theo dõi trạng thái chuột hiện tại. Sau đó, mã 100ms của bạn chỉ có thể truy vấn nó.

+0

Tôi nghĩ về điều đó, nhưng nó phức tạp hơn một chút. Tôi nghĩ tôi sẽ thử xem có ai biết phương pháp trực tiếp lấy trạng thái của con chuột hay không và nếu không thì hãy sử dụng trình xử lý sự kiện. –

2

Có hay không, bạn có chắc chắn muốn thực hiện việc này không?

Dường như với tôi rằng bạn có thể bỏ lỡ các nhấp chuột theo cách đó. 100 mili giây là một phần mười giây .. Nhiều lần nhấp không kéo dài quá lâu.

Và ngay cả khi bạn thực hiện vòng lặp bỏ phiếu ngắn hơn, tất cả những gì bạn đang làm là thu hẹp cửa sổ trong thời gian bạn có thể bỏ lỡ một nhấp chuột, vì vậy nó sẽ bỏ lỡ các nhấp chuột ít thường xuyên hơn. Nhưng nó vẫn sẽ là một điều kiện đua.

Tôi đoán rằng mối quan tâm của bạn về sự phức tạp bắt nguồn từ việc phải xử lý vấn đề luồng, nhưng trừ khi bạn cung cấp thêm thông tin, chúng tôi không thể giúp bạn nhiều.

+0

100 millis đã được chỉ ra khỏi đỉnh đầu của tôi, tôi đã có kế hoạch để thử nghiệm với thời gian khác nhau. Điểm tốt về các nhấp chuột bị thiếu. Tôi đang cố gắng làm cho chuột hoạt động như một công cụ cọ vẽ cho một chương trình đồ họa, mà sẽ liên quan đến việc có chương trình phản hồi dựa trên thời gian con chuột được nhấn, trong số những thứ khác. Điều tôi muốn tìm hiểu là liệu có thể thực hiện loại truy vấn trực tiếp cấp thấp này, và sau đó tôi sẽ thử nghiệm, xem cách hoạt động tốt và sử dụng nó hoặc thử sử dụng trình xử lý sự kiện thay thế. –

+0

Đối với một chương trình vẽ tranh, tôi đã sử dụng một MouseMotionListener và thực hiện mouseDragged() để cho phép vẽ. –

0

Sẽ đủ dễ dàng để viết Trình xử lý để xử lý trạng thái chuột. Xem Global Event Listeners để giới thiệu về AWTEventListener cho phép bạn lắng nghe tất cả các sự kiện chuột với một người nghe duy nhất.

Sau đó, trong trình lắng nghe, bạn sẽ bắt đầu Bộ hẹn giờ.

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