2017-06-05 48 views
0

如何使用TransferHandler複製JLabel的文本時如何獲取兩個JLabel的文本?Java:如何在使用TransferHandler複製JLabel的文本時如何獲取兩個JLabel的文本?

Label1111111如何在複製到Label2222222時保留兩個JLabel的文本。

因此,我將控制兩個Jlabel的文本。這種形狀只能得到第一次舉行的JLabel文本。預先感謝您的幫助。

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

回答

0

也許就是這樣。我在handlerLabel中添加了內部類MyLabel和控制檯輸出。在您的main下按Ctrl + v。它將打印以控制每個MyLabelsoriginalString屬性。

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

編輯:檢查了這一點。在你的主目錄下按Ctrl + V。它將打印到源標籤的文本和目標標籤的文本,也是original屬性。 MyLabel類執行DropTargetListener,然後由new DropTarget(this, this)註冊。然後我們定義覆蓋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:下面的代碼生成 這樣的結果 看到這個答案的最終結果是:Label111111

label2222222

它還打印original財產安慰。這些可以有不同的組織方式(MyLabel,MyLabelTransferable,MyLabelDropTargetListener,MyLabelTransferHandler類,只是爲了給未來的重構一個想法),但它也以這種方式工作。考慮一下你的用例的quickfix。

所以主類是這樣的:

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

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

然後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."); 
    } 
} 

後最終編輯結果如下:

final result

澄清一下:

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

。這是重要的路線。這將使getTransferData()返回相同的實例MyLabel。如果你會做這樣的:

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

您將無法,改變重寫drop()方法mySourceLabel文本爲「空」,因爲你會被給予該對象的副本。

Why shouldn't you extend JFrame and other components?。並且您可以提供對「空白」文本的檢查(如果getText()返回「空白」,則不要更改目標MyLabel中的文本)。

如果這有幫助,接受答案:)

+0

謝謝你的回答。但是當我拖動Label11111時,我需要在Label22222中獲取值並檢查它。我無法以這種方式獲得Label22222。如果你能幫助解決這個問題,我將不勝感激。 – MeHcKeR

+0

所以當我拖動Label1111時,我需要在Label2222中獲取Text()來檢查它。 – MeHcKeR

+0

@MeHcKeR編輯了我的答案。 – bigby