2017-06-05 4 views
0

Comment obtenir le texte de deux JLabels lors de la copie du texte de JLabel avec TransferHandler?Java: Comment obtenir le texte de deux JLabels lors de la copie du texte de JLabel avec TransferHandler?

Label1111111 Comment conserver le texte des deux JLabels lors de la copie sur Label2222222.

Pour cette raison, je vais prendre le contrôle de deux textes de Jlabel. Cette forme peut seulement obtenir le texte de JLabel, qui a d'abord été tenu. Merci d'avance pour votre aide.

public class deneme2 extends JFrame { 

    private static final int COPY = 0; 
    private static final int NONE = 0; 
    private JPanel contentPane; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        deneme2 frame = new deneme2(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public deneme2() {  
     JPanel panel= new JPanel(); 
     MouseListener listener = new DragMouseAdapter();  

     JLabel label1 = new JLabel("Label1111111", JLabel.CENTER);   
     handlerLabel(label1); 
     label1.addMouseListener(listener); 
     panel.add(label1); 

     JLabel label2 = new JLabel("Label2222222", JLabel.CENTER); 
     handlerLabel(label2); 
     label2.addMouseListener(listener); 
     panel.add(label2); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 

     contentPane.add(panel); 
     setContentPane(contentPane); 
    } 

    private void handlerLabel (JLabel lbl) 
    { 
     lbl.setTransferHandler(new TransferHandler("text") { 
       @Override 
       protected void exportDone(JComponent source, Transferable data, int action) { 
        if (action == COPY){ 
         ((JLabel)lbl.getDropTarget().getDropTargetContext().getComponent()).getText(); 
         //((JLabel) source).setText("LabelEmpty");          
         } 
       }    
      }); 
    } 

    private class DragMouseAdapter extends MouseAdapter 
    { 
     public void mousePressed(MouseEvent e) 
     { 
      JComponent comp = (JComponent)e.getSource(); 
      TransferHandler handler = comp.getTransferHandler(); 
      handler.exportAsDrag(comp, e, TransferHandler.COPY); 
     }   
    } 
} 

Répondre

0

Peut-être de cette façon. J'ai ajouté la classe interne MyLabel et la sortie de la console dans votre handlerLabel. Ctrl + v ceci sous votre main. Il imprimera pour consolider la propriété originalString de chaque MyLabels.

public class MyLabel extends JLabel { 
     String original; 

     public MyLabel (String text) 
     { 
      super(text); 
      this.original=text; 
     } 

     public String getOriginal() { 
      return original; 
     } 

     public void setOriginal(String original) { 
      this.original = original; 
     } 

    } 
    public deneme2() {  
     JPanel panel= new JPanel(); 
     MouseListener listener = (MouseListener) new DragMouseAdapter();  

     MyLabel label1 = new MyLabel("Label1111111");   
     handlerLabel(label1); 
     label1.addMouseListener(listener); 
     panel.add(label1); 

     MyLabel label2 = new MyLabel("Label2222222"); 
     handlerLabel(label2); 
     label2.addMouseListener(listener); 
     panel.add(label2); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 

     contentPane.add(panel); 
     setContentPane(contentPane); 
    } 

     private void handlerLabel(MyLabel lbl) { 
     lbl.setTransferHandler(new TransferHandler("text") { 
      @Override 
      protected void exportDone(JComponent source, Transferable data, int action) { 
       if (action == COPY) { 
        System.out.println(((MyLabel) lbl.getDropTarget().getDropTargetContext().getComponent()).getOriginal()); 
       } 
      } 
     }); 
    } 

Edit: vérifier. Ctrl + V cela sous votre principale. Il imprimera au texte de la console de la source et du texte de l'étiquette cible, également la propriété original. La classe MyLabel implémente DropTargetListener, qui est ensuite enregistrée par new DropTarget(this, this). Ensuite, nous définissons ce qui va se passer dans la méthode drop.

public class MyLabel extends JLabel implements DropTargetListener { 

     String original; 

     public MyLabel(String text) { 
      super(text); 
      this.original = text; 

      new DropTarget(this, this); 

      this.setTransferHandler(new TransferHandler("text")); 

      final MouseListener listener = new MouseAdapter() { 
       @Override 
       public void mousePressed(final MouseEvent me) { 
        final MyLabel label = (MyLabel) me.getSource(); 
        final TransferHandler handler = label.getTransferHandler(); 
        handler.exportAsDrag(label, me, TransferHandler.COPY); 
       } 
      }; 

      this.addMouseListener(listener); 
     } 

     public String getOriginal() { 
      return original; 
     } 

     public void setOriginal(String original) { 
      this.original = original; 
     } 

     @Override 
     public void dragEnter(DropTargetDragEvent dtde) { 

     } 

     @Override 
     public void dragOver(DropTargetDragEvent dtde) { 

     } 

     @Override 
     public void dropActionChanged(DropTargetDragEvent dtde) { 

     } 

     @Override 
     public void dragExit(DropTargetEvent dte) { 

     } 

     @Override 
     public void drop(DropTargetDropEvent dtde) { 
      try { 
       final String sourceString = (String) dtde.getTransferable().getTransferData(new DataFlavor("application/x-java-jvm-local-objectref; class=java.lang.String")); 
       System.out.println("Source: " + sourceString + " target: " + this.getText()); 
       this.setText(sourceString); 
       System.out.println("Original target: "+this.getOriginal()); 
      } catch (final UnsupportedFlavorException | IOException | ClassNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

    public deneme2() { 
     JPanel panel = new JPanel(); 
     MyLabel label1 = new MyLabel("Label1111111a"); 
     panel.add(label1); 

     MyLabel label2 = new MyLabel("Label2222222b"); 
     panel.add(label2); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 

     contentPane.add(panel); 
     setContentPane(contentPane); 
    } 
} 

EDIT2: code suivant génère ce résultat voir le résultat à la fin de cette réponse: Label111111

ou

label2222222

Il imprime aussi original propriété à la console . Ceux-ci pourraient être organisés différemment (MyLabel, MyLabelTransferable, MyLabelDropTargetListener, MyLabelTransferHandler classes, juste pour donner une idée pour le futur refactoring) mais cela fonctionne aussi de cette façon. Considérez-le comme un correctif pour votre cas d'utilisation.

donc la classe principale est la suivante:

public class Deneme2 extends JFrame { 

    private static final int COPY = 0; 
    private static final int NONE = 0; 

    public static void main(String[] args) { 
     Deneme2 mainFrame = new Deneme2(); 
     SwingUtilities.invokeLater(() -> {//let's get that frame on EDT rollin lambda style:) 
      mainFrame.setVisible(true); 
     }); 

    } 

    public Deneme2() { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     MyLabel label1 = new MyLabel("Label1111111a"); 
     panel.add(label1, BorderLayout.WEST); 

     MyLabel label2 = new MyLabel("Label2222222b"); 
     panel.add(label2, BorderLayout.EAST); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setBounds(100, 100, 450, 300); 

     panel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     this.add(panel); 
    } 
} 

Puis MyLabel.java:

public class MyLabel extends JLabel implements DropTargetListener, Transferable { 

    String original; 
    protected static final DataFlavor MYLABEL_DATA_FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + "; class=\"" + MyLabel.class.getCanonicalName() + "\"", 
      "MyLabel label"); 
    protected static final DataFlavor[] SUPPORTED_FLAVORS = {MYLABEL_DATA_FLAVOR}; 

    public MyLabel(String text) { 
     super(text); 
     this.original = text; 
     new DropTarget(this, this); 
     this.setTransferHandler(new MyLabelTransferHandler()); //here we use our custom TransferHandler 
     final MouseListener listener = new MouseAdapter() { 
      @Override 
      public void mousePressed(final MouseEvent me) { 
       final MyLabel label = (MyLabel) me.getSource(); 
       final TransferHandler handler = label.getTransferHandler(); 
       handler.exportAsDrag(label, me, TransferHandler.COPY); 
      } 
     }; 
     this.addMouseListener(listener); 

    } 

    public String getOriginal() { 
     return original; 
    } 

    public void setOriginal(String original) { 
     this.original = original; 
    } 

    @Override 
    public void dragEnter(DropTargetDragEvent dtde) { 
     if (dtde.getTransferable().isDataFlavorSupported(MyLabel.MYLABEL_DATA_FLAVOR)) { 
      System.out.println("Drop accept - MyLabel"); 
      dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE); 
     } else { 
      dtde.rejectDrag(); 
     } 
    } 

    @Override 
    public void dragOver(DropTargetDragEvent dtde) { 
     //System.out.println("Drag over"); 
    } 

    @Override 
    public void dropActionChanged(DropTargetDragEvent dtde) { 
     System.out.println("Action changed"); 
    } 

    @Override 
    public void dragExit(DropTargetEvent dte) { 
     System.out.println("Exited"); 

    } 

    @Override 
    public void drop(DropTargetDropEvent dtde) { 
     System.out.println("Drop detected"); 

     if (dtde.getTransferable().isDataFlavorSupported(MyLabel.MYLABEL_DATA_FLAVOR)) { 
      Transferable t = dtde.getTransferable(); 

      if (t.isDataFlavorSupported(MyLabel.MYLABEL_DATA_FLAVOR)) { 
       try { 
        Object transferData = t.getTransferData(MyLabel.MYLABEL_DATA_FLAVOR); 

        if (transferData instanceof MyLabel) { 
         MyLabel mySourceLabel = (MyLabel) transferData; 

         if (!(mySourceLabel.equals(this))) { 
          dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); 
          this.setText(mySourceLabel.getText()); 
          mySourceLabel.setText("Empty"); 
          System.out.println(mySourceLabel.getOriginal() + " " + this.getOriginal()); 
         } else { 
          dtde.rejectDrop(); 
          System.out.println("Drop rejected - the same MyLabel"); 
         } 
        } else { 
         dtde.rejectDrop(); 
        } 
       } catch (UnsupportedFlavorException | IOException ex) { 
        dtde.rejectDrop(); 
       } 
      } else { 
       dtde.rejectDrop(); 
      } 
     } 
    } 

    @Override 
    public DataFlavor[] getTransferDataFlavors() { 
     return SUPPORTED_FLAVORS; 
    } 

    @Override 
    public boolean isDataFlavorSupported(DataFlavor flavor) { 
     return flavor.equals(MYLABEL_DATA_FLAVOR) || flavor.equals(DataFlavor.stringFlavor); 

    } 

    @Override 
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 
     if (flavor.equals(MYLABEL_DATA_FLAVOR)) { 
      return this; 
     } else if (flavor.equals(DataFlavor.stringFlavor)) { 
      return this.getText(); 
     } else { 
      throw new UnsupportedFlavorException(flavor); 
     } 
    } 
} 

Et puis MyLabelTransferHandler.java:

public class MyLabelTransferHandler extends TransferHandler { 

    @Override 
    public boolean canImport(TransferHandler.TransferSupport support) { 
     return (support.getComponent() instanceof MyLabel) && support.isDataFlavorSupported(MyLabel.MYLABEL_DATA_FLAVOR); 
    } 

    @Override 
    public boolean importData(JComponent src, Transferable transferable) { 
     return src instanceof MyLabel; 
    } 

    @Override 
    public int getSourceActions(JComponent c) { 
     return DnDConstants.ACTION_COPY; 
    } 

    @Override 
    protected Transferable createTransferable(JComponent c) { 
     Transferable t = (MyLabel)c; 
     return t; 
    } 

    @Override 
    protected void exportDone(JComponent source, Transferable data, int action) { 
     System.out.println("Export done."); 
    } 
} 

Après résultat de montage final ressemble à ceci:

final result

petite précision:

protected static final DataFlavor MYLABEL_DATA_FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + "; class=\"" + MyLabel.class.getCanonicalName() + "\"", 
      "MyLabel label"); 

dans MyLabel. C'est une ligne importante. Cela fera getTransferData() retourner la même instance de MyLabel.Si vous le faire comme:

protected static final DataFlavor MYLABEL_DATA_FLAVOR = new DataFlavor(MyLabel.class, "MyLabel label"); 

vous ne serez pas en mesure de changer mySourceLabel texte « vide » dans la méthode surchargée drop(), puisque vous recevez une copie de cet objet.

Egalement Why shouldn't you extend JFrame and other components?. Et vous pouvez fournir la vérification pour le texte «vide» (si getText() renvoie «vide», puis ne pas modifier le texte dans la cible MyLabel). Et si cela aide, acceptez la réponse :)

+0

Merci pour votre réponse. Mais quand je fais glisser Label11111, je dois obtenir la valeur dans Label22222 et la vérifier. Je ne peux pas obtenir Label22222 de cette façon. Si vous pouviez m'aider dans cette situation, je l'apprécierais grandement. – MeHcKeR

+0

Donc quand je fais glisser Label1111 j'ai besoin de getText() dans Label2222 pour le vérifier. – MeHcKeR

+0

@MeHcKeR a édité ma réponse. – bigby