swing - 整个框架的setTransferHandler

时间:2017-10-04 21:29:50

标签: java swing drag-and-drop

我有一个包含按钮和文本字段的框架。我写了一个传输处理程序,所以我可以将文件放入其中。但是,当我在框架上设置传输处理程序时,只有按钮接受拖放。

我的解决方法是为面板的所有组件设置传输处理程序。

这样做的正确方法是什么?

    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);

2 个答案:

答案 0 :(得分:1)

查看方法getAllChildrenOfClass

here

在您的情况下,您应该使用以下方法

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);
    });
  }
}