2013-10-15 23 views
2

我試圖將MyObject拖到JTable。但無法找到如何。將MyObject拖到JTable(DnD)

我能得到幫助,任何這個點的(最好是3點)

** ** 1只有很好的例子,我發現是這樣的:?

指南:http://www.bryanesmith.com/docs/drag-and-drop-java-5/ 來源:http://www.bryanesmith.com/docs/drag-and-drop-java-5/DragAndDropPanelsDemo.java

問題的這是我得到:

拋出java.lang.ClassNotFoundException:RandomDragAndDropPanel(線:197)

任何想法爲什麼?

** 2。**其他好例子的提示?

或** 3 **以下是我放在一起的一個例子。但它只顯示String,而不是MyObject

enter image description here

我所做的嘗試,使這項工作是添加:

public static DataFlavor FLAVOR = new DataFlavor(MyObject.class, "My Object"); 

但我有問題implementing Transferable並添加TransferHandlerMyObject。任何想法它應該是什麼樣子?

import java.awt.Color; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.io.IOException; 

import javax.swing.BorderFactory; 
import javax.swing.DefaultListModel; 
import javax.swing.DropMode; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.TransferHandler; 
import javax.swing.table.DefaultTableModel; 

public class FlavorTest extends JFrame { 

    // FLAVOR = STRING 
    private DataFlavor FLAVOR = new DataFlavor(String.class, "DataWrapper"); 

    public FlavorTest() { 

     // CREATE TABLE 
     DefaultTableModel model = getDefaultTableModel(); 
     JTable table = new JTable(model); 
     addDragSupport(table, model); 
     table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
     table.setDropMode(DropMode.INSERT_ROWS); 
     table.setFillsViewportHeight(true); 

     // ADD TABLE AND DRAG OBJECT TO PANEL 
     JPanel panel = new JPanel(); 
     panel.add(new MyObject("DRAG OBJECT")); 
     panel.add(table); 

     // ADD PANEL TO JFRAME 
     this.add(panel); 
     this.pack(); 
     this.setDefaultCloseOperation(1); 
     this.setVisible(true); 
    } 

    // CREATE TABLE DATA 
    private DefaultTableModel getDefaultTableModel() { 
     String[] cols = { "a", "b", "c" }; 
     String[][] rows = { { "1", "2", "3" } }; 
     return new DefaultTableModel(rows, cols); 
    } 

    // SET TRANSFER HANDLER TO TABLE 
    private void addDragSupport(final JTable table, final DefaultTableModel model) { 
     table.setTransferHandler(new TransferHandler() { 

      public boolean canImport(TransferSupport support) { 
       return true; 
      } 

      public boolean importData(TransferSupport support) { 
       JTable.DropLocation dl = (JTable.DropLocation) support.getDropLocation(); 
       int row = dl.getRow(); 
       Object data; 
       try { 
        data = (Object) support.getTransferable().getTransferData(FLAVOR); 
       } catch (UnsupportedFlavorException e) { 
        e.printStackTrace(); 
        return false; 
       } catch (IOException e) { 
        e.printStackTrace(); 
        return false; 
       } 
       String[] rowData = data.toString().split(","); 
       model.insertRow(row, rowData); 
       return true; 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     new FlavorTest(); 
    } 

    // CONTAINS A DRAGABLE JLIST WITH A STRING 
    private class MyObject extends JPanel { 

     public MyObject(String text) { 
      DefaultListModel<String> model = new DefaultListModel<String>(); 
      model.addElement(text); 
      JList<String> list = new JList<String>(model); 
      list.setModel(model); 
      list.setDragEnabled(true); 
      list.setFocusable(false); 
      this.add(list); 
      this.setBorder(BorderFactory.createLineBorder(Color.black)); 
     } 
    } 
} 
+0

你在你的表上需要一個自定義的TransferHandler來接受你的對象 - 這不是String類型,還是它?重新閱讀之後,不明白你在做什麼:MyObject是一個JPanel,當你把它放在一個JTable上時會發生什麼?請注意,你從不**向**表添加組件。 – kleopatra

+0

我真正想做的是將MyObject添加到JTable。一旦將它放入JTable中,我希望能夠調用例如myObject.getText(),然後在JTable中顯示此文本(或「MyObject」包含的其他數據)。 – Grains

回答

2

仍然不知道到底是什麼問題 - 以下是一個簡單的自定義的TransferHandler,允許從列表中拖動項目,並將其拖放到一個表(每列一個屬性)。它的使用是非常簡單的(它在SwingX測試環境,因爲我懶,只是用核心部件和扔進框架:)

JXTable table = new JXTable(0, 2); 
DefaultComboBoxModel persons = new DefaultComboBoxModel(
     new PersonObject[] { new PersonObject("first", "last"), 
       new PersonObject("first2", "last2"), 
       new PersonObject("first3", "last3"), }); 
JXList list = new JXList(persons); 
PersonTransferHandler handler = new PersonTransferHandler(); 
list.setTransferHandler(handler); 
list.setDragEnabled(true); 
table.setTransferHandler(handler); 
showWithScrollingInFrame(table, list, "custom dnd"); 

一些自定義類型的自定義處理程序:

/** 
* Just an example: can export Person objects from a list an 
* import to a table with two columns 
*/ 
public static class PersonTransferHandler extends TransferHandler { 

    DataFlavor personFlavor = new DataFlavor(PersonObject.class, "PersonObject"); 
    DataFlavor[] flavors = new DataFlavor[] {personFlavor}; 

    /** 
    * Implemented to return true if the support can provide string values. 
    */ 
    @Override 
    public boolean canImport(TransferSupport support) { 
     if (!support.isDrop()) { 
      return false; 
     } 
     if (!(support.getComponent() instanceof JTable)) { 
      return false; 
     } 
     return isSupportedType(support); 
    } 


    @Override 
    public boolean importData(TransferSupport support) { 
     if (!canImport(support)) { 
      return false; 
     } 
     try { 
      PersonObject person = (PersonObject) support.getTransferable().getTransferData(personFlavor); 
      Object[] rowData = new Object[]{person.firstName, person.lastName}; 
      JTable table = (JTable) support.getComponent(); 
      ((DefaultTableModel) table.getModel()).addRow(rowData); 
      return true; 
     } catch (UnsupportedFlavorException | IOException e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 


    @Override 
    protected Transferable createTransferable(JComponent c) { 
     if (!(c instanceof JList)) return null; 
     JList list = (JList) c; 
     final PersonObject person = (PersonObject) list.getSelectedValue(); 
     Transferable t = new Transferable() { 

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

      @Override 
      public boolean isDataFlavorSupported(DataFlavor flavor) { 
       return personFlavor.equals(flavor); 
      } 

      @Override 
      public Object getTransferData(DataFlavor flavor) 
        throws UnsupportedFlavorException, IOException { 
       return person; 
      } 

     }; 
     return t; 
    } 



    @Override 
    public int getSourceActions(JComponent c) { 
     return COPY; 
    } 


    private boolean isSupportedType(TransferSupport support) { 
     DataFlavor[] flavors = support.getDataFlavors(); 
     for (DataFlavor dataFlavor : flavors) { 
      if (dataFlavor.getRepresentationClass() == PersonObject.class) return true; 
     } 
     return false; 
    } 

} 

public static class PersonObject { 
    String firstName; 
    String lastName; 

    public PersonObject() { 

    } 
    /** 
    * @param firstName 
    * @param lastName 
    */ 
    public PersonObject(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

} 
+0

很棒!這正是我想要的(自定義對象放在JTable中)。非常感謝! – Grains