2017-10-04 2 views
0

J'ai un cadre qui contient un bouton et un champ de texte. J'ai écrit un gestionnaire de transfert pour y déposer des fichiers. Toutefois, lorsque je définis le gestionnaire de transfert sur le cadre, seul le bouton accepte la suppression.swing - setTransferHandler pour toute la trame

La solution de contournement que j'ai consiste à définir le gestionnaire de transfert pour tous les composants du panneau.

Quelle est la bonne façon de le faire?

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

'La solution que j'ai est de définir le gestionnaire de transfert pour tous les composants du panel.' - me semble raisonnable. Vous ne pouvez pas ajouter un KeyListener à un panneau et le faire fonctionner pour tous les champs de texte sur le panneau. – camickr

+0

Eh bien, dans mon cas, j'ai seulement un champ de texte, et de toute façon mon gestionnaire sait quoi faire ... J'ajoute le même gestionnaire à tous les composants, et ça fonctionne bien. Et si cela ne fonctionne pas sur JFrame. pourquoi est-il possible de l'ajouter du tout? – ModdyFire

Répondre

1

Rechercher here pour la méthode getAllChildrenOfClass

Dans votre cas, vous devez utiliser cette méthode comme suit

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

Merci, On dirait que cela fonctionnerait (n'ont pas le temps de vérifier maintenant) mais se sent encore comme un hack, – ModdyFire

-1


Les composants suivants goutte d'appui hors de la boîte. Si vous utilisez l'un de ces composants, votre travail est terminé.

  • JEditorPane
  • JFormattedTextField
  • JPasswordField
  • JTextArea
  • JTextField
  • JTextPane
  • JColorChooser

Donc je suppose que vous devez utiliser JComponent#setTransferHandler(null) pour supprimer le TransferHandler intégré.

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