我有一个包含按钮和文本字段的框架。我写了一个传输处理程序,所以我可以将文件放入其中。但是,当我在框架上设置传输处理程序时,只有按钮接受拖放。
我的解决方法是为面板的所有组件设置传输处理程序。
这样做的正确方法是什么?
JPanel panel = new JPanel();
flowPanel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
JTextField textField = new JTextField();
textField.setMaximumSize(new Dimension(4000, 30));
JButton button = new JButton("Button");
button.setHorizontalAlignment(SwingConstants.LEFT);
TransferHandler newHandler = new TransferHandler() {
public boolean canImport(TransferHandler.TransferSupport info) {
return true;
}
};
// downs't work - only the button accepts a drop
panel.setTransferHandler(newHandler);
// A workaround - does what I want
textField.setTransferHandler(newHandler);
button.setTransferHandler(newHandler);
panel.add(button);
panel.add(textField);
答案 0 :(得分:1)
查看方法getAllChildrenOfClass
在您的情况下,您应该使用以下方法
JFrame myFrame = ...; // your jframe
List<JComponent> comps = getAllChildrenOfClass(myFrame.getRootPane(), JComponent.class);
// you can also use myFrame.getContentPane() instead of myFrame.getRootPane()
for (JComponent c : comps) {
c.setTransferHanler(newHandler);
}
答案 1 :(得分:-1)
Default DnD Support (The Java™ Tutorials > Creating a GUI With JFC/Swing > Drag and Drop and Data Transfer)
以下组件支持开箱即用。如果您正在使用其中一个组件,那么您的工作就已完成。
JEditorPane
JFormattedTextField
JPasswordField
JTextArea
JTextField
JTextPane
JColorChooser
所以我猜您需要使用JComponent#setTransferHandler(null)删除内置TransferHandler
。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextComponentTransferHandlerTest {
public JComponent makeUI() {
JPanel panel = new JPanel();
JTextField textField = new JTextField("BasicTextUI$TextTransferHandler");
System.out.println(textField.getTransferHandler());
JTextField textField2 = new JTextField("setTransferHandler(null)");
textField2.setTransferHandler(null); //reset default
JButton button = new JButton("Button");
button.setHorizontalAlignment(SwingConstants.LEFT);
TransferHandler newHandler = new TransferHandler() {
@Override public boolean canImport(TransferSupport info) {
return true;
}
};
panel.setTransferHandler(newHandler);
// A workaround - does what I want
// textField.setTransferHandler(newHandler);
// button.setTransferHandler(newHandler);
panel.add(button);
panel.add(textField);
panel.add(textField2);
return panel;
}
public static void main(String... args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new TextComponentTransferHandlerTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}