Tôi có một số JTextField
mà tôi hy vọng sẽ đề xuất các kết quả phù hợp với đầu vào của người dùng. Tôi đang hiển thị các đề xuất này trong một số JList
có trong một số JPopupMenu
.Dừng JPopupMenu lấy cắp tiêu điểm
Tuy nhiên, khi mở menu bật lên được lập trình qua show(Component invoker, int x, int y)
, tiêu điểm được lấy từ JTextField
.
Thật kỳ lạ, nếu tôi gọi setVisible(true)
thay vào đó, tiêu điểm không bị đánh cắp; nhưng sau đó JPopupMenu
không được đính kèm vào bất kỳ bảng điều khiển nào và khi giảm thiểu ứng dụng trong khi hộp đang mở, nó vẫn được vẽ trên cửa sổ.
Tôi cũng đã cố gắng để thiết lập lại tập trung vào JTextField
sử dụng requestFocus()
, nhưng sau đó tôi phải khôi phục lại vị trí dấu nháy sử dụng SwingUtilities.invokeLater()
, và invoke sau bên thứ là cho người sử dụng một biên độ nhẹ để lộn xộn xung quanh với nội dung hiện có/ghi đè lên/hoặc thực hiện những điều không thể đoán trước khác.
Mã tôi nhận được là một cách hiệu quả:
JTextField field = new JTextField();
JPopupMenu menu = new JPopupMenu();
field.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
JList list = getAListOfResults();
menu.add(list);
menu.show(field, 0, field.getHeight());
}
});
bất cứ ai có thể đề xuất những con đường tốt nhất để đi xuống để hiển thị các JPopupMenu
lập trình trong khi duy trì sự tập trung vào các JTextField
?
Câu trả lời hay ... hoạt động hoàn hảo .. cảm ơn;) – Isaac
Điều này đã giúp tôi rất nhiều, cảm ơn! – Epaga
Sau rất nhiều googling, câu trả lời này đã giúp tôi rất nhiều –