Tôi đang nhúng JFileChooser
vào chương trình của mình trong khung của riêng tôi với các thành phần tùy chỉnh khác trong khung. Dưới đây là một thiết kế của ứng dụng của tôi vì nó có thể giúp hình dung vấn đề của tôi:Làm cách nào để xóa hành động Ctrl + C trên JFileChooser?
Nếu bạn không thể nói, danh sách trực thuộc JFrame
tiêu đề là JFileChoosers
. Cách này được cho là hoạt động là bạn gán phím tắt cho các đích và sau đó khi bạn bấm các phím tắt đó, tập tin được chọn sẽ di chuyển đến đích.
Chiến lược của tôi để thực hiện việc này là gán lối tắt cho phạm vi javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW
của InputMap
toàn bộ khung.
Nhưng những gì gây phiền nhiễu là một cái gì đó (tôi giả định JFileChooser
) tiếp tục đáp ứng/hấp thụ các phím bấm mà tôi không muốn. Ví dụ: nếu tôi nhấn Ctrl+C
thao tác phím tắt của tôi sẽ không chạy. Tôi đã thử điều này với cái nhìn và cảm nhận bản địa (Tôi đang sử dụng windows 7) và mặc định L & F và cả hai tình huống đều có cùng một vấn đề. Tôi nghĩ rằng nó có thể là cố gắng để làm một hành động sao chép của tập tin được chọn trong JFileChooser
bởi vì nếu tôi bấm vào một trong các nút để buộc nó để mất tập trung, tất cả các bất ngờ của tôi Ctrl+C
lệnh nào hành động của tôi.
Nhưng, tôi không thực sự chắc chắn cách thức JFileChooser
đang thực hiện việc này. Khi tôi gọi getKeyListeners()
trên đó, nó sẽ trả về một mảng trống. Tôi cũng đã thử xóa bản đồ đầu vào của nó cho sự kết hợp quan trọng này ở cả ba phạm vi, và nó vẫn có vẻ hấp thụ phím bấm.
Có ai có thể cho tôi một số mã mẫu làm cho số JFileChooser
bỏ qua Ctrl+C
không? Ngoài ra, sẽ rất hữu ích nếu ai đó có thể cho tôi biết cách gỡ lỗi các vấn đề như thế này trong tương lai.
Dưới đây là một số mã về những gì tôi đã thử cho đến nay. Bạn cũng có thể sử dụng điều này để cố gắng kiểm tra điều này một mình, kể từ khi mã này biên dịch và chạy, như-là:
package com.sandbox;
import javax.swing.*;
import java.awt.event.ActionEvent;
public class Sandbox {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("control C"), "println");
panel.getActionMap().put("println", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.out.println("The JPanel action was performed!");
}
});
panel.add(buildFileChooser()); //if you comment out this line, Ctrl+C does a println, otherwise my action is ignored.
frame.setContentPane(panel);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
private static JFileChooser buildFileChooser() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.getActionMap().clear(); //I've tried lots of ideas like this, but the JFileChooser still responds to Ctrl+C
return fileChooser;
}
}
CẬP NHẬT: Tôi đã đi xa như để đệ quy xóa inputMaps và loại bỏ các keyListeners của JFileChooser và tất cả các thành phần con của nó và JFileChooser vẫn còn nuốt lệnh Ctrl + C của tôi. Đây là mã tôi đã sử dụng để thực hiện việc này (tôi đã chuyển JFileChooser của tôi vào đây):
private static void removeKeyboardReactors(JComponent root) {
System.out.println("I'm going to clear the inputMap of: " + root);
root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).clear();
root.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).clear();
root.getInputMap(JComponent.WHEN_FOCUSED).clear();
root.getActionMap().clear();
if (root.getRootPane() != null) {
removeKeyboardReactors(root.getRootPane());
}
for (KeyListener keyListener : root.getKeyListeners()) {
root.removeKeyListener(keyListener);
}
for (Component component : root.getComponents()) {
if (component instanceof JComponent) {
removeKeyboardReactors((JComponent) component);
} else if (component instanceof Container) {
Container container = (Container) component;
for (Component containerComponent : container.getComponents()) {
if (containerComponent instanceof JComponent) {
removeKeyboardReactors((JComponent) containerComponent);
} else {
System.out.println("This Container Component was not a JComponent: " + containerComponent);
}
}
} else {
System.out.println("This was not a JComponent: " + component);
}
}
}
Không chắc lý do tại sao bạn yêu cầu tôi giúp đỡ đây. Bạn có câu trả lời. Ctrl C không hoạt động mọi lúc bởi vì các thành phần như JTextField và JList ánh xạ những ràng buộc khóa này. Bạn đã xóa ràng buộc này khỏi tất cả các thành phần trên trình chọn tệp để mã của bạn sẽ hoạt động ngay bây giờ. Tất nhiên vấn đề với giải pháp này là sẽ xóa chức năng Ctrl + C khỏi tất cả các thành phần trong ứng dụng của bạn, không chỉ các thành phần trên trình chọn tệp. Tôi không biết giải pháp nào khác. – camickr
@camickr Để cụ thể, tôi đã liên kết bạn với nhận xét tôi đã đưa ra cho câu trả lời tôi nhận được. "Tôi tìm thấy một vấn đề với điều này.Nếu bạn chuyển nó sang chế độ xem chi tiết, hãy nhấp vào một tệp mà nó vẫn nuốt "Điều khiển C". Nhưng nếu bạn bấm vào các trường văn bản nó không phải là tốt bởi vì nó được sử dụng để trước. Bất kỳ ý tưởng gì gây ra điều đó? " –