2011-01-09 33 views
12

Tôi có một ứng dụng được phát triển trong netbeans và tôi muốn đặt tiêu điểm thành một số jTextField nhất định khi bảng được hiển thị. Tôi đã đọc một số bài viết và đã thử các phương pháp khác nhau nhưng không làm việc. Một trong những vấn đề chính là nơi đặt mã bắt buộc, mà tôi tin rằng trong trường hợp của tôi là this.txtMessage.requestFocusInWindow();Đặt trọng tâm vào trường văn bản

Có một số bài đăng cho biết sử dụng Trình nghe cửa sổ, tuy nhiên khi netbeans đã tạo GUI, tôi không thể xem cách triển khai các giao diện như tôi không thể chỉnh sửa mã tạo ra jPANEL vv. Toàn bộ điều rất bực bội và tôi thực sự không tin rằng điều này sẽ khó khăn đến vậy.

Cũng giống như một bài kiểm tra tôi đã thêm requestFocusInWindow(); vào một nút trên bảng điều khiển và nó đã đặt tiêu điểm thành đầu vào mong muốn.

+1

Bạn phải sử dụng tạo mã NetBeans vì việc này thường dễ dàng hơn nhiều trong các dự án Swing được tạo bằng tay. Cá nhân, đây là một trong những lý do tại sao tôi nghĩ rằng việc tạo ra các dự án Swing phức tạp với các trình tạo mã như thông qua Matisse của NetBean khó hơn nhiều so với việc tạo mã bằng tay. –

Trả lời

15

Tôi đã có một kịch bản tương tự ở đâu Tôi cần đặt trọng tâm vào hộp văn bản trong bảng điều khiển khi bảng điều khiển được hiển thị. Bảng điều khiển được tải khi khởi động ứng dụng, vì vậy tôi không thể đặt tiêu điểm trong hàm tạo. Vì bảng điều khiển không được tải hoặc được tập trung vào chương trình, điều này có nghĩa là tôi không có sự kiện nào để kích hoạt yêu cầu tập trung.

Để giải quyết vấn đề này, tôi đã thêm phương thức toàn cầu vào phương thức chính của mình, được gọi là phương thức trong bảng điều khiển được gọi requestFocusInWindow() trên vùng văn bản. Tôi thực hiện cuộc gọi đến phương thức toàn cục trong nút hiển thị bảng điều khiển, sau cuộc gọi hiển thị. Điều này có nghĩa là bảng điều khiển sẽ được hiển thị và sau đó vùng văn bản được gán tiêu điểm sau khi hiển thị bảng điều khiển. Hy vọng rằng có ý nghĩa và giúp!

Ngoài ra, bạn có thể chỉnh sửa hầu hết mã được tạo tự động bằng cách nhấp chuột phải vào đối tượng trong chế độ xem thiết kế và chọn mã tùy chỉnh, tuy nhiên tôi không nghĩ rằng nó cho phép bạn chỉnh sửa bảng.

10

Tôi không chắc liệu mình có thiếu thứ gì ở đây hay không, nhưng không có lý do gì khiến bạn không thể thêm người nghe vào bảng điều khiển của mình.

Trong Netbeans, chỉ cần nhấn nút "Nguồn" ở trên cùng bên trái của cửa sổ trình chỉnh sửa và bạn có thể chỉnh sửa hầu hết mã. Mã bố trí thực tế chủ yếu bị khóa, nhưng bạn thậm chí có thể tùy chỉnh nếu bạn cần.

Theo như tôi biết, txtMessage.requestFocusInWindow() được cho là thiết lập tiêu điểm mặc định khi cửa sổ được hiển thị lần đầu tiên. Nếu bạn muốn yêu cầu sự tập trung sau khi cửa sổ đã được hiển thị đã có, bạn nên sử dụng txtMessage.requestFocus()

Để thử nghiệm, bạn chỉ có thể thêm một người biết lắng nghe trong constructor:

addWindowListener(new WindowAdapter(){ 
    public void windowOpened(WindowEvent e){ 
    txtMessage.requestFocus(); 
    } 
}); 
+1

Bạn không nên sử dụng requestFocus(). Đọc mô tả API cho phương thức đó. requestFocusInWindow() là phương thức thích hợp để sử dụng. – camickr

+0

Hi Riaan và cảm ơn bạn đã trả lời, vấn đề là với một JPanel thats có một jTextField tôi muốn đặt trọng tâm vào. Cửa sổ chính tải JPanel như và khi nó cần nó, txtMessage.requestFocus() không có hiệu lực. và thêm một người nghe cửa sổ trên cửa sổ chính có vẻ như lãng phí thời gian vì nó tải một số JPanel không chỉ là một với trường văn bản, vv – Lee

3

Trong JFrame hoặc JDialog bạn luôn có thể ghi đè phương thức setVisible(), nó hoạt động tốt. Tôi đã không cố gắng trong một JPanel, nhưng có thể là một thay thế.

@Override 
public void setVisible(boolean value) { 
    super.setVisible(value); 
    control.requestFocusInWindow(); 
} 
0

Đối với tôi là cách dễ nhất để làm cho nó làm việc, là đưa dòng component.requestFocus();, sau khi dòng setVisible(true);, ở dưới cùng của khung hoặc constructor bảng. Điều này có thể liên quan đến việc yêu cầu trọng tâm, sau khi tạo ra một thành phần mới, sau khi yêu cầu lấy nét, sẽ làm cho thành phần của bạn bị mất tập trung và tập trung vào thành phần mới được tạo của bạn. Ít nhất, đó là những gì tôi giả định.

1

Tôi đã đùa giỡn với điều này mãi mãi, và cuối cùng đã tìm thấy thứ gì đó dường như luôn hoạt động!

textField = new JTextField() { 

     public void addNotify() { 
      super.addNotify(); 
      requestFocus(); 
     } 
    }; 
0

Không có điều nào ở trên phù hợp với tôi, vì cửa sổ của tôi là JPopupMenu.

gì đã làm công việc là thế này:

addAncestorListener(new AncestorListener() { 
    @Override 
    public void ancestorAdded(AncestorEvent ae) { 
     myEdit.requestFocus(); 
    } 

    // ... other ancestor listener methods 
} 
0

tôi đã làm nó bằng cách thiết lập một sự kiện AncesterAdded trên TextField và trọng tâm yêu cầu trong cửa sổ.

+1

Bạn có thể đăng một số mã ví dụ không? – shieldgenerator7

0

Nếu bạn tạo GUI với Netbeans, bạn cũng có thể chèn một số mã tự viết. Chỉ cần chọn một phần tử (có thể là nút, bảng điều khiển hoặc cửa sổ) và sử dụng "Mã" -tab trong "Thuộc tính" -dialog.

Ở đó bạn có thể chèn TrướcMã bưu điện- cho các phần khác nhau của quy trình tạo.

Tôi nghĩ trường "Sau khi tất cả đặt mã" của cửa sổ là nơi tốt cho mã của bạn hoặc bạn có thể liên kết nó với sự kiện ("Thuộc tính" -dialog -> "Sự kiện") "componentShown "của trường văn bản/bảng điều khiển.

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