2012-02-08 29 views
7

Hãy để tôi bắt đầu bằng cách nói rằng tôi đã đọc số drag'n drop tutorial và các câu hỏi tương tự được hỏi trên SO, nhưng tiếc là tôi chỉ trở nên bối rối hơn về vấn đề này. Những gì tôi muốn đạt được là tương đối đơn giản vì vậy tôi ngạc nhiên rằng nó đã cho tôi trong rất nhiều rắc rối rồi. Tôi đang viết một ứng dụng tiện ích nhỏ sẽ hợp nhất một loạt các tệp kết quả (loại xml được định nghĩa tùy chỉnh) thành một tệp văn bản được phân tách bằng tab lớn. Hầu hết các chức năng đã được mã hóa, tuy nhiên tôi muốn tạo một GUI phong nha cho nó.Kéo thả các tập tin từ ứng dụng OS sang Java (Swing)

Điều tôi muốn là có thể kéo thả tệp vào thành phần (ví dụ JTextArea) theo cách đẹp và duyên dáng (đọc: không phải đường dẫn đầy đủ, thay vào đó là biểu tượng và tên nhỏ). Tôi muốn có thể cung cấp một số JFileChooser để duyệt các tệp. Sau đó tôi sẽ phân tích cú pháp các tập tin tuần tự để tạo ra ma trận mà tôi muốn.

Điều tôi đã học được từ trước đến nay là khung công tác đã có sẵn, tuy nhiên, bất kỳ chức năng bổ sung nào cũng cần phải được tạo tùy chỉnh. Tôi đã tạo ra một thử nghiệm GUI trong Netbeans và cố gắng kéo một loạt các tập tin vào một JTextArea, nhưng chúng xuất hiện như là đường dẫn tập tin, và thừa nhận nó trông rất xấu xí.

Tôi thực sự đánh giá cao mọi mẹo và hướng dẫn về cách giải quyết (hoặc làm rõ) vấn đề này một cách gọn gàng. Lưu ý rằng tôi có ý định sử dụng phần mềm trên nhiều hệ điều hành khác nhau (Mac, Win và Linux).

EDIT: mã tôi đã cho đến nay được dựa trên một trong những ví dụ từ Sun hướng dẫn và thực hiện như sau

import java.awt.datatransfer.*; 
import java.awt.event.*; 
import java.awt.*; 
import java.io.*; 
import javax.swing.*; 
import javax.swing.UIManager.LookAndFeelInfo; 
import javax.swing.border.TitledBorder; 
import javax.swing.filechooser.FileNameExtensionFilter; 
import javax.swing.text.*; 

public class ConsolidatorDemo extends JPanel implements ActionListener { 
    private static final long serialVersionUID = -4487732343062917781L; 
    JFileChooser fc; 
    JButton clear; 
    JTextArea dropZone, console; 
    JSplitPane childSplitPane, parentSplitPane; 
    PrintStream ps; 

    public ConsolidatorDemo() { 
    super(new BorderLayout()); 

    fc = new JFileChooser();; 
    fc.setMultiSelectionEnabled(true); 
    fc.setDragEnabled(true); 
    fc.setControlButtonsAreShown(false); 
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY);    


    JPanel fcPanel = new JPanel(new BorderLayout()); 
    fcPanel.add(fc, BorderLayout.CENTER); 

    clear = new JButton("Clear All"); 
    clear.addActionListener(this); 
    JPanel buttonPanel = new JPanel(new BorderLayout()); 
    buttonPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    buttonPanel.add(clear, BorderLayout.LINE_END); 

    JPanel leftUpperPanel = new JPanel(new BorderLayout()); 
    leftUpperPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    leftUpperPanel.add(fcPanel, BorderLayout.CENTER); 
    leftUpperPanel.add(buttonPanel, BorderLayout.PAGE_END); 


    JScrollPane leftLowerPanel = new javax.swing.JScrollPane(); 
    leftLowerPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    dropZone = new JTextArea(); 
    dropZone.setColumns(20); 
    dropZone.setLineWrap(true); 
    dropZone.setRows(5); 
    dropZone.setDragEnabled(true); 
    dropZone.setDropMode(javax.swing.DropMode.INSERT); 
    dropZone.setBorder(new TitledBorder("Selected files/folders")); 
    leftLowerPanel.setViewportView(dropZone); 

    childSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
      leftUpperPanel, leftLowerPanel); 
    childSplitPane.setDividerLocation(400); 
    childSplitPane.setPreferredSize(new Dimension(480, 650)); 

    console = new JTextArea(); 
    console.setColumns(40); 
    console.setLineWrap(true); 
    console.setBorder(new TitledBorder("Console")); 

    parentSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
        childSplitPane, console); 
    parentSplitPane.setDividerLocation(480); 
    parentSplitPane.setPreferredSize(new Dimension(800, 650)); 

    add(parentSplitPane, BorderLayout.CENTER); 

} 

public void setDefaultButton() { 
    getRootPane().setDefaultButton(clear); 
} 

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == clear) { 
     dropZone.setText(""); 

    } 
} 

/** 
* Create the GUI and show it. For thread safety, 
* this method should be invoked from the 
* event-dispatching thread. 
*/ 
private static void createAndShowGUI() { 
    //Make sure we have nice window decorations. 
    JFrame.setDefaultLookAndFeelDecorated(true); 
    try { 
     //UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaBlackStarLookAndFeel"); 
     for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

    //Create and set up the window. 
    JFrame frame = new JFrame("Consolidator!"); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

    //Create and set up the menu bar and content pane. 
    ConsolidatorDemo demo = new ConsolidatorDemo(); 
    demo.setOpaque(true); //content panes must be opaque 
    frame.setContentPane(demo); 

    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
    demo.setDefaultButton(); 
} 

public static void main(String[] args) { 
    //Schedule a job for the event-dispatching thread: 
    //creating and showing this application's GUI. 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
+0

Vâng vâng, có lẽ tôi đã không làm cho các câu hỏi rõ ràng; "Làm cách nào để thêm tính năng kéo thả vào GUI, nơi các tệp được kéo được thể hiện độc đáo với tên tệp và biểu tượng nhỏ (biểu tượng hệ thống sẽ làm, tôi không có ý định thiết kế biểu tượng tùy chỉnh)?" Tôi đã đi xa như các tập tin DnD'd được đại diện với đường dẫn của họ (mà tôi tin là khá nhiều hành vi mặc định). – posdef

+0

Cảm ơn bạn đã nhắc nhở, mã được thêm ngay bây giờ. – posdef

+1

tại sao textArea là dropZone? Tôi sẽ sử dụng một danh sách với một renderer tùy chỉnh (hiển thị biểu tượng/displayName được cung cấp bởi FileSystemView) – kleopatra

Trả lời

9

đây là một đoạn nhanh chóng để nhập khẩu các tập tin thực tế vào một JList (như trái ngược để nhập biểu diễn Chuỗi của nó vào một thành phần văn bản) và sử dụng trình kết xuất tùy chỉnh để trình bày nó một cách độc đáo. Nó chuyển thể từ BasicDnD (trong hướng dẫn):

fileDropper = new JList(new DefaultListModel()); 
    fileDropper.setDragEnabled(true); 
    leftLowerPanel.setViewportView(fileDropper); 

    TransferHandler handler = new TransferHandler() { 

     @Override 
     public boolean canImport(TransferHandler.TransferSupport info) { 
      // we only import FileList 
      if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
       return false; 
      } 
      return true; 
     } 

     @Override 
     public boolean importData(TransferHandler.TransferSupport info) { 
      if (!info.isDrop()) { 
       return false; 
      } 

      // Check for FileList flavor 
      if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
       displayDropLocation("List doesn't accept a drop of this type."); 
       return false; 
      } 

      // Get the fileList that is being dropped. 
      Transferable t = info.getTransferable(); 
      List<File> data; 
      try { 
       data = (List<File>)t.getTransferData(DataFlavor.javaFileListFlavor); 
      } 
      catch (Exception e) { return false; } 
      DefaultListModel model = (DefaultListModel) fileDropper.getModel(); 
      for (File file : data) { 
       model.addElement(file); 
      } 
      return true; 
     } 

     private void displayDropLocation(String string) { 
      System.out.println(string); 
     } 
    }; 
    fileDropper.setTransferHandler(handler); 
    fileDropper.setCellRenderer(new DefaultListRenderer(
      StringValues.FILE_NAME, IconValues.FILE_ICON)); 

Không thể cưỡng lại để cho thấy SwingX renderer cấu hình :-) Trong java core, bạn sẽ làm điều đó bằng tay, một cái gì đó giống như

class MyRenderer extends DefaultListCellRenderer { 

     @Override 
     public Component getListCellRendererComponent(...) { 
      super.getList... 
      if (value instanceof File) { 
       setText(FileSystemView.getFileSystemView().getDisplayName(value); 
       setIcon(FileSystemView.getFileSystemView().getSystemIcon(value); 
      } 
      return this; 
     } 

    } 
+0

Cảm ơn ví dụ. Tôi đoán rằng bit cuối cùng với 'MyRenderer' được cho là ở vị trí của' fileDropper.setCellRenderer (new DefaultListRenderer (StringValues.FILE_NAME, IconValues.FILE_ICON)); 'Thấy là' StringValues.FILE_NAME' và 'IconValues. FILE_ICON' không xác định/không thể được giải quyết? Hay tôi đã hiểu lầm điều gì đó? – posdef

+0

Tôi đã kết hợp một số điểm đó vào SSCCE của bạn (và đăng nó dưới dạng câu trả lời). –

7

này là câu trả lời hiệu quả của kleopatra (với một vài thay đổi nhỏ, không nhất thiết phải tốt hơn), ..với ảnh chụp màn hình!

ConsolidatorDemo

import java.awt.datatransfer.*; 
import java.awt.event.*; 
import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.io.*; 
import javax.swing.*; 
import javax.swing.UIManager.LookAndFeelInfo; 
import javax.swing.border.TitledBorder; 
import javax.swing.filechooser.FileNameExtensionFilter; 
import javax.swing.filechooser.FileSystemView; 
import javax.swing.text.*; 
import java.util.List; 

public class ConsolidatorDemo extends JPanel implements ActionListener { 
    private static final long serialVersionUID = -4487732343062917781L; 
    JFileChooser fc; 
    JButton clear; 
    JTextArea console; 

    JList dropZone; 
    DefaultListModel listModel; 
    JSplitPane childSplitPane, parentSplitPane; 
    PrintStream ps; 

    public ConsolidatorDemo() { 
    super(new BorderLayout()); 

    fc = new JFileChooser();; 
    fc.setMultiSelectionEnabled(true); 
    fc.setDragEnabled(true); 
    fc.setControlButtonsAreShown(false); 
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY); 


    JPanel fcPanel = new JPanel(new BorderLayout()); 
    fcPanel.add(fc, BorderLayout.CENTER); 

    clear = new JButton("Clear All"); 
    clear.addActionListener(this); 
    JPanel buttonPanel = new JPanel(new BorderLayout()); 
    buttonPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    buttonPanel.add(clear, BorderLayout.LINE_END); 

    JPanel leftUpperPanel = new JPanel(new BorderLayout()); 
    leftUpperPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
    leftUpperPanel.add(fcPanel, BorderLayout.CENTER); 
    leftUpperPanel.add(buttonPanel, BorderLayout.PAGE_END); 

    JScrollPane leftLowerPanel = new javax.swing.JScrollPane(); 
    leftLowerPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 

    listModel = new DefaultListModel(); 
    dropZone = new JList(listModel); 
    dropZone.setCellRenderer(new FileCellRenderer()); 
    dropZone.setTransferHandler(new ListTransferHandler(dropZone)); 
    dropZone.setDragEnabled(true); 
    dropZone.setDropMode(javax.swing.DropMode.INSERT); 
    dropZone.setBorder(new TitledBorder("Selected files/folders")); 
    leftLowerPanel.setViewportView(new JScrollPane(dropZone)); 

    childSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
      leftUpperPanel, leftLowerPanel); 
    childSplitPane.setDividerLocation(400); 
    childSplitPane.setPreferredSize(new Dimension(480, 650)); 

    console = new JTextArea(); 
    console.setColumns(40); 
    console.setLineWrap(true); 
    console.setBorder(new TitledBorder("Console")); 

    parentSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
        childSplitPane, console); 
    parentSplitPane.setDividerLocation(480); 
    parentSplitPane.setPreferredSize(new Dimension(800, 650)); 

    add(parentSplitPane, BorderLayout.CENTER); 

} 

public void setDefaultButton() { 
    getRootPane().setDefaultButton(clear); 
} 

public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == clear) { 
     listModel.clear(); 
    } 
} 

/** 
* Create the GUI and show it. For thread safety, 
* this method should be invoked from the 
* event-dispatching thread. 
*/ 
private static void createAndShowGUI() { 
    //Make sure we have nice window decorations. 
    JFrame.setDefaultLookAndFeelDecorated(true); 
    try { 
     //UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaBlackStarLookAndFeel"); 
     for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

    //Create and set up the window. 
    JFrame frame = new JFrame("Consolidator!"); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

    //Create and set up the menu bar and content pane. 
    ConsolidatorDemo demo = new ConsolidatorDemo(); 
    demo.setOpaque(true); //content panes must be opaque 
    frame.setContentPane(demo); 

    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
    demo.setDefaultButton(); 
} 

public static void main(String[] args) { 
    //Schedule a job for the event-dispatching thread: 
    //creating and showing this application's GUI. 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
} 

class FileCellRenderer extends DefaultListCellRenderer { 

    public Component getListCellRendererComponent(JList list, 
     Object value, 
     int index, 
     boolean isSelected, 
     boolean cellHasFocus) { 

     Component c = super.getListCellRendererComponent(
      list,value,index,isSelected,cellHasFocus); 

     if (c instanceof JLabel && value instanceof File) { 
      JLabel l = (JLabel)c; 
      File f = (File)value; 
      l.setIcon(FileSystemView.getFileSystemView().getSystemIcon(f)); 
      l.setText(f.getName()); 
      l.setToolTipText(f.getAbsolutePath()); 
     } 

     return c; 
    } 
} 

class ListTransferHandler extends TransferHandler { 

    private JList list; 

    ListTransferHandler(JList list) { 
     this.list = list; 
    } 

    @Override 
    public boolean canImport(TransferHandler.TransferSupport info) { 
     // we only import FileList 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public boolean importData(TransferHandler.TransferSupport info) { 
     if (!info.isDrop()) { 
      return false; 
     } 

     // Check for FileList flavor 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      displayDropLocation("List doesn't accept a drop of this type."); 
      return false; 
     } 

     // Get the fileList that is being dropped. 
     Transferable t = info.getTransferable(); 
     List<File> data; 
     try { 
      data = (List<File>)t.getTransferData(DataFlavor.javaFileListFlavor); 
     } 
     catch (Exception e) { return false; } 
     DefaultListModel model = (DefaultListModel) list.getModel(); 
     for (Object file : data) { 
      model.addElement((File)file); 
     } 
     return true; 
    } 

    private void displayDropLocation(String string) { 
     System.out.println(string); 
    } 
} 
  1. tôi đang bận viết một câu trả lời khi tôi nhận thấy cô đã đăng một. Vì TransferHandler của tôi rất bị hỏng nên tôi đã sử dụng nó. Mặc dù tôi đã sử dụng phiên bản trình kết xuất ô danh sách của mình nhưng dường như không nắm bắt được sự tinh tế của những gì cô ấy đang đề xuất. Tôi cũng nhận được lỗi biên dịch về đề cập đến List (cho trình biên dịch giả sử tôi có nghĩa là danh sách AWT. Tôi chỉ nhận ra những gì đã xảy ra sau khi tôi đã thay đổi một số câu lệnh loại List<File> thành không chung chung - tôi nghĩ hầu hết chúng bây giờ đã được thay đổi trở lại.
+0

Cảm ơn một loạt lớn Andrew, nó hoạt động mà không có một vấn đề về kết thúc của tôi. (Tôi đã gặp vấn đề với 'Danh sách' khi tôi đang thử ví dụ của cô ấy). Tôi không chắc tôi hoàn toàn hiểu được gợi ý 'ListCellRenderer' của kleopatra. Tôi có nghĩa là tôi làm theo phiên bản của bạn, nhưng tôi không nghĩ rằng tôi hoàn toàn nắm bắt được sự khéo léo trong phiên bản của cô ấy. – posdef

+0

Nó chủ yếu là 'FileSystemView.getFileSystemView(). GetDisplayName (value)' mà tôi nghi ngờ có thể tạo ra một tên tốt hơn (nhưng chưa được thử nghiệm). BTW - nếu bạn gặp khó khăn trong việc quyết định ai để 'đánh dấu' vào, tôi đề nghị câu trả lời của cô ấy, vì nó là chính xác và đầu tiên. –

+0

Cảm ơn bạn đã làm rõ, tôi thử cả hai để xem liệu có sự khác biệt đáng kể nào không. Tôi cảm thấy như tôi đã nhận được nhiều sự giúp đỡ từ bạn hơn cô ấy nhưng tôi sẽ tôn trọng đề xuất của bạn. – posdef

0

Đây là mã mà không cần giao diện điều khiển và thêm nút

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.PrintStream; 
import java.util.List; 

import javax.swing.BorderFactory; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.DefaultListModel; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTextArea; 
import javax.swing.TransferHandler; 
import javax.swing.UIManager; 
import javax.swing.UIManager.LookAndFeelInfo; 
import javax.swing.border.TitledBorder; 
import javax.swing.filechooser.FileSystemView; 

public class ConsolidatorDemo extends JPanel implements ActionListener { 
    private static final long serialVersionUID = -4487732343062917781L; 
    // JFileChooser fc; 
    JButton clear,compare; 
    JTextArea fc; 

    JList dropZone; 
    DefaultListModel listModel; 
    JSplitPane childSplitPane, parentSplitPane; 
    PrintStream ps; 

    public ConsolidatorDemo() { 
     super(new BorderLayout()); 

     /* fc = new JFileChooser();; 
    fc.setMultiSelectionEnabled(true); 
    fc.setDragEnabled(true); 
    fc.setControlButtonsAreShown(false); 
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY);*/ 
     fc= new JTextArea(); 
     fc.setText("Rules:\n1. drop old html first.\n2. drop new html.\n3. drop output folder.\n4. click compare button.\n5. Check output in the output.txt file.\nEnd"); 

     fc.setEditable(false); 
     JPanel fcPanel = new JPanel(new BorderLayout()); 

     fcPanel.add(fc, BorderLayout.CENTER); 


     compare = new JButton("Compare"); 
     compare.addActionListener(this); 
     JPanel buttonPanel1 = new JPanel(new BorderLayout()); 
     buttonPanel1.setBorder(BorderFactory.createEmptyBorder(1,1,1,1)); 
     buttonPanel1.add(compare, BorderLayout.LINE_END); 


     clear = new JButton("Clear All"); 
     clear.addActionListener(this); 
     JPanel buttonPanel = new JPanel(new BorderLayout()); 
     buttonPanel.setBorder(BorderFactory.createEmptyBorder(1,1,1,1)); 
     buttonPanel.add(clear, BorderLayout.LINE_END); 

     JPanel leftUpperPanel = new JPanel(new BorderLayout()); 
     leftUpperPanel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3)); 
     leftUpperPanel.add(fcPanel, BorderLayout.CENTER); 
     leftUpperPanel.add(buttonPanel1, BorderLayout.LINE_END); 
     leftUpperPanel.add(buttonPanel, BorderLayout.PAGE_END); 

     JScrollPane leftLowerPanel = new javax.swing.JScrollPane(); 
     leftLowerPanel.setBorder(BorderFactory.createEmptyBorder(3,3,3,3)); 

     listModel = new DefaultListModel(); 
     dropZone = new JList(listModel); 
     dropZone.setCellRenderer(new FileCellRenderer()); 
     dropZone.setTransferHandler(new ListTransferHandler(dropZone)); 
     dropZone.setDragEnabled(true); 
     dropZone.setDropMode(javax.swing.DropMode.INSERT); 
     dropZone.setBorder(new TitledBorder("Drag and drop files here")); 
     leftLowerPanel.setViewportView(new JScrollPane(dropZone)); 

     childSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, leftLowerPanel,leftUpperPanel); 
     childSplitPane.setDividerLocation(200);//400 
     childSplitPane.setPreferredSize(new Dimension(300, 400));//480, 650 

     /*console = new JTextArea(); 
    console.setColumns(40); 
    console.setLineWrap(true); 
    console.setBorder(new TitledBorder("Console")); 

    parentSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
        childSplitPane, console); 
    parentSplitPane.setDividerLocation(480); 
    parentSplitPane.setPreferredSize(new Dimension(800, 650));*/ 

     add(childSplitPane, BorderLayout.CENTER); 

    } 

    public void setDefaultButton() { 
     getRootPane().setDefaultButton(clear); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == clear) { 
      listModel.clear(); 
     }else if (e.getSource() == compare) { 
      //our function 
     } 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event-dispatching thread. 
    */ 
    private static void createAndShowGUI() { 
     //Make sure we have nice window decorations. 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     try { 
      //UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaBlackStarLookAndFeel"); 
      for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 

     //Create and set up the window. 
     JFrame frame = new JFrame("Bill of materials Comparer"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     //Create and set up the menu bar and content pane. 
     ConsolidatorDemo demo = new ConsolidatorDemo(); 
     demo.setOpaque(true); //content panes must be opaque 
     frame.setContentPane(demo); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
     demo.setDefaultButton(); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

class FileCellRenderer extends DefaultListCellRenderer { 

    public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus) { 

     Component c = super.getListCellRendererComponent(list,value,index,isSelected,cellHasFocus); 

     if (c instanceof JLabel && value instanceof File) { 
      JLabel l = (JLabel)c; 
      File f = (File)value; 
      l.setIcon(FileSystemView.getFileSystemView().getSystemIcon(f)); 
      l.setText(f.getName()); 
      //l.setText(f.getAbsolutePath()); 
      l.setToolTipText(f.getAbsolutePath()); 
     } 

     return c; 
    } 
} 

class ListTransferHandler extends TransferHandler { 

    private JList list; 

    ListTransferHandler(JList list) { 
     this.list = list; 
    } 

    @Override 
    public boolean canImport(TransferHandler.TransferSupport info) { 
     // we only import FileList 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public boolean importData(TransferHandler.TransferSupport info) { 
     if (!info.isDrop()) { 
      return false; 
     } 

     // Check for FileList flavor 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      displayDropLocation("List doesn't accept a drop of this type."); 
      return false; 
     } 

     // Get the fileList that is being dropped. 
     Transferable t = info.getTransferable(); 
     List<File> data; 
     try { 
      data = (List<File>)t.getTransferData(DataFlavor.javaFileListFlavor); 
     } 
     catch (Exception e) { return false; } 
     DefaultListModel model = (DefaultListModel) list.getModel(); 
     for (Object file : data) { 
      model.addElement((File)file); 
     } 
     return true; 
    } 

    private void displayDropLocation(String string) { 
     System.out.println(string); 
    } 
} 
Các vấn đề liên quan