2014-09-25 21 views
0

我想拖放一個文件,該文件必須在新的/單獨的tab中打開。我爲DragAndDrop.But編寫了代碼。我從計算機上拖放文本文件。它複製或覆蓋文件的內容。但是,當我拖放一個文件時,它應該在一個單獨的選項卡中打開。如何才能做到這一點。請給我建議。謝謝。我已發佈我的原始應用程序。它有兩個類。如何使用swing在新選項卡中拖放文本文件

主要類:

public class OpenDemo extends javax.swing.JFrame implements ChangeListener{ 
    private ArrayList<OInternalFrame> frames = new ArrayList<OInternalFrame>(); 
    private OInternalFrame currentFrame; 
    int i=0; 
    JTabbedPane tabbedPane2; 
    public OpenDemo() { 
    initComponents(); 
} 
@SuppressWarnings("unchecked")       
private void initComponents() { 
    tabbedPane2=new JTabbedPane(); 
    this.add(tabbedPane2); 
    enableDragAndDrop(); 
    tp = new javax.swing.JTabbedPane(); 
    jMenuBar1 = new javax.swing.JMenuBar(); 
    jMenu1 = new javax.swing.JMenu(); 
    open = new javax.swing.JMenuItem(); 
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    jMenu1.setText("File"); 
    open.setText("Open"); 
    open.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      openActionPerformed(evt); 
     } 
    }); 
    jMenu1.add(open); 
    jMenuBar1.add(jMenu1); 
    setJMenuBar(jMenuBar1); 
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(tp, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(tp, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE)); 
    pack(); 
}      

private void openActionPerformed(java.awt.event.ActionEvent evt) {          
    FileDialog fd = new FileDialog(OpenDemo.this, "Select File", FileDialog.LOAD); 
    fd.setVisible(true); 
    String sts; 
    if (fd.getFile() != null) { 
     sts = fd.getDirectory() + fd.getFile(); 
     System.out.println(sts); 
     BufferedReader br = null; 
     StringBuffer str = new StringBuffer(""); 
     try { 
      br = new BufferedReader(new FileReader(sts)); 
      String line; 
      try { 
       while ((line = br.readLine()) != null) { 
        str.append(line + "\n"); 
       } 
      } catch (IOException ex) { 
       Logger.getLogger(OpenDemo.class.getName()).log(Level.SEVERE, null, ex); 
       } 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(OpenDemo.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     String t = str.toString(); 
     OInternalFrame internalFrame = new OInternalFrame("",true,true); 
     i++; 
     internalFrame.setName("Doc "+i); 
     try { 
      internalFrame.setSelected(true); 
     } catch (PropertyVetoException ex) { 
      Logger.getLogger(OpenDemo.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     internalFrame.addInternalFrameListener(new InternalFrameAdapter() { 
      @Override 
      public void internalFrameClosing(InternalFrameEvent e) { 
       i--; 
       frames.remove(currentFrame); 
       tp.remove(currentFrame); 
      } 
     }); 
     tp.add(internalFrame); 
     tp.setSelectedIndex(i-1); 
     tp.addChangeListener(this); 
     frames.add(internalFrame); 
     currentFrame=internalFrame; 

     currentFrame.setText(t); 
     currentFrame.setVisible(true); 
    }  
} 
@Override 
public void stateChanged(ChangeEvent ce) { 
    JTabbedPane sourceTabbedPane = (JTabbedPane) ce.getSource(); 
    int index = sourceTabbedPane.getSelectedIndex(); 
    try { 
     currentFrame =frames.get(index); 
    } 
    catch(IndexOutOfBoundsException e1){ 
    } 
} 
public static void main(String args[]) { 
try { 
    for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
     if ("Nimbus".equals(info.getName())) { 
      javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
      break; 
     } 
    } 
} catch (ClassNotFoundException ex) { 
    java.util.logging.Logger.getLogger(OpenDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
} catch (InstantiationException ex) { 
    java.util.logging.Logger.getLogger(OpenDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
} catch (IllegalAccessException ex) { 
    java.util.logging.Logger.getLogger(OpenDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
} catch (javax.swing.UnsupportedLookAndFeelException ex) { 
    java.util.logging.Logger.getLogger(OpenDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
} 
java.awt.EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     new OpenDemo().setVisible(true); 
    } 
    }); 
    } 
private javax.swing.JMenu jMenu1; 
private javax.swing.JMenuBar jMenuBar1; 
private javax.swing.JMenuItem open; 
private javax.swing.JTabbedPane tp;  
private void enableDragAndDrop() { 
    OInternalFrame iFrame=new OInternalFrame("",true,true); 
    DropTarget target=new DropTarget(currentFrame.textArea,new DropTargetListener(){ 
    public void dragEnter(DropTargetDragEvent e) { 
    } 
    public void dragExit(DropTargetEvent e) { 
    } 
    public void dragOver(DropTargetDragEvent e) { 
    } 
    public void dropActionChanged(DropTargetDragEvent e) { 
    } 
    public void drop(DropTargetDropEvent e) { 
     try { 
      e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); 
      java.util.List list=(java.util.List)e.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); 
      File file=(File)list.get(0); 
      //JTextArea newTabTextArea=new JTextArea(); 
      //DropTarget target=new DropTarget(newTabTextArea,this); 
      DropTarget target=new DropTarget(currentFrame.textArea,this); 
      //newTabTextArea.read(new FileReader(file),null); 
      currentFrame.textArea.read(new FileReader(file),null); 
      //newTabTextArea.setCaretPosition(0); 
      currentFrame.textArea.setCaretPosition(0); 
      //tabbedPane2.add(add(newTabTextArea)); 
      tp.add(currentFrame.textArea); 
      int tabIndex=tp.indexOfComponent(currentFrame.textArea); 
      tp.setSelectedIndex(tabIndex); 
      tp.setTitleAt(tabIndex,file.getName()); 
      add(tp); 
     } 
     catch(Exception ex){} 
    } 
}); 
} 
} 

OInternalFrame:

public class OInternalFrame extends JInternalFrame 
{ 
public JTextArea textArea; 
private JScrollPane scrollPane; 
JTabbedPane tabbedPane2; 
public OInternalFrame(String title,boolean resizable,boolean closable) 
{ 
    super(title,resizable,closable); 
    initComponents(); 
} 
private void initComponents() { 
    textArea = new JTextArea(); 
    tabbedPane2=new JTabbedPane(); 
    scrollPane = new JScrollPane(); 
    textArea.setFont(new java.awt.Font("Miriam Fixed", 0, 13)); 
    add(scrollPane); 
    scrollPane.getViewport().add(textArea); 
    setVisible(true); 
    scrollPane.setVisible(true); 
} 
public void setText(String t) { 
    textArea.setText(t); 
    textArea.setCaretPosition(0); 
    textArea.setVisible(true); 
    textArea.repaint(); 
} 
} 
+0

任何人給我答覆。 – user3912886 2014-09-25 12:16:31

+1

考慮發佈格式良好的代碼,許多人會考慮努力閱讀它。請記住,我們是志願者,如果你讓人們更難理解你的代碼和問題,很多人會轉向下一個問題。 – 2014-09-26 01:11:38

+0

我編輯我的代碼,很容易理解,請檢查一次。謝謝您的回覆。 – user3912886 2014-09-26 05:13:30

回答

0

Repalce與此代碼你OpenDemo文件: 變化是

  • 增加了新的主框架每一滴事件
  • 逐滴加入事件聽者這是缺少內部框架。
  • 通過打開菜單項
  • 添加了刪除Listner在內部框架中添加DropListner的新內部類而不是匿名類以重新使用代碼。
  • 某些次要問題
  • 您應該逐步調試,您可以輕鬆地找到這些問題。

    public class OpenDemo extends javax.swing.JFrame implements ChangeListener 
    { 
    private ArrayList<OInternalFrame> frames = new ArrayList<OInternalFrame>(); 
    private OInternalFrame currentFrame; 
    private DropTargetListener dropListner; 
    int i=0; 
    JTabbedPane tabbedPane2; 
    public OpenDemo() { 
        initComponents(); 
    } 
    @SuppressWarnings("unchecked") 
    private void initComponents() { 
    dropListner=new DropTargetListener(); 
    currentFrame=new OInternalFrame("doc1",true,true); 
    tabbedPane2=new JTabbedPane(); 
    this.add(tabbedPane2); 
    enableDragAndDrop(); 
    tp = new javax.swing.JTabbedPane(); 
    jMenuBar1 = new javax.swing.JMenuBar(); 
    jMenu1 = new javax.swing.JMenu(); 
    open = new javax.swing.JMenuItem(); 
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    jMenu1.setText("File"); 
    open.setText("Open"); 
    open.addActionListener(new java.awt.event.ActionListener() { 
        public void actionPerformed(java.awt.event.ActionEvent evt) { 
         openActionPerformed(evt); 
        } 
    }); 
    jMenu1.add(open); 
    jMenuBar1.add(jMenu1); 
    setJMenuBar(jMenuBar1); 
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
         layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
           .addComponent(tp, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) 
    ); 
    layout.setVerticalGroup(
         layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
           .addComponent(tp, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE)); 
    pack(); 
    } 
    
    private void openActionPerformed(java.awt.event.ActionEvent evt) { 
    FileDialog fd = new FileDialog(OpenDemo.this, "Select File", FileDialog.LOAD); 
    fd.setVisible(true); 
    String sts; 
    if (fd.getFile() != null) { 
        sts = fd.getDirectory() + fd.getFile(); 
        System.out.println(sts); 
        BufferedReader br = null; 
        StringBuffer str = new StringBuffer(""); 
        try { 
         br = new BufferedReader(new FileReader(sts)); 
         String line; 
         try { 
          while ((line = br.readLine()) != null) { 
           str.append(line + "\n"); 
          } 
         } catch (IOException ex) { 
          Logger.getLogger(OpenDemo.class.getName()).log(Level.SEVERE, null, ex); 
         } 
        } catch (FileNotFoundException ex) { 
         Logger.getLogger(OpenDemo.class.getName()).log(Level.SEVERE, null, ex); 
        } 
        String t = str.toString(); 
        OInternalFrame internalFrame = new OInternalFrame("",true,true); 
        i++; 
        internalFrame.setName("Doc "+i); 
        // Should file name here 
        internalFrame.setName(fd.getFile()); 
        DropTarget target=new DropTarget(internalFrame.textArea,dropListner); 
        try { 
         internalFrame.setSelected(true); 
        } catch (PropertyVetoException ex) { 
         Logger.getLogger(OpenDemo.class.getName()).log(Level.SEVERE, null, ex); 
        } 
        internalFrame.addInternalFrameListener(new InternalFrameAdapter() { 
         @Override 
         public void internalFrameClosing(InternalFrameEvent e) { 
          i--; 
          frames.remove(currentFrame); 
          tp.remove(currentFrame); 
         } 
        }); 
        tp.add(internalFrame); 
        tp.setSelectedIndex(i-1); 
        tp.addChangeListener(this); 
        frames.add(internalFrame); 
        currentFrame=internalFrame; 
    
        currentFrame.setText(t); 
        currentFrame.setVisible(true); 
    } 
    } 
    @Override 
    public void stateChanged(ChangeEvent ce) { 
    JTabbedPane sourceTabbedPane = (JTabbedPane) ce.getSource(); 
    int index = sourceTabbedPane.getSelectedIndex(); 
    try { 
        currentFrame =frames.get(index); 
    } 
    catch(IndexOutOfBoundsException e1){ 
    } 
    } 
    public static void main(String args[]) { 
    try { 
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
         if ("Nimbus".equals(info.getName())) { 
          javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
          break; 
         } 
        } 
    } catch (ClassNotFoundException ex) { 
        java.util.logging.Logger.getLogger(OpenDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
        java.util.logging.Logger.getLogger(OpenDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
        java.util.logging.Logger.getLogger(OpenDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
        java.util.logging.Logger.getLogger(OpenDemo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    java.awt.EventQueue.invokeLater(new Runnable() { 
        public void run() { 
         new OpenDemo().setVisible(true); 
        } 
    }); 
    } 
    private javax.swing.JMenu jMenu1; 
    private javax.swing.JMenuBar jMenuBar1; 
    private javax.swing.JMenuItem open; 
    private javax.swing.JTabbedPane tp; 
    private void enableDragAndDrop() { 
    DropTarget target=new DropTarget(this,dropListner); 
    } 
    
    private class DropTargetListener implements java.awt.dnd.DropTargetListener 
    { 
    public void dragEnter(DropTargetDragEvent e) { 
    } 
    public void dragExit(DropTargetEvent e) { 
    } 
    public void dragOver(DropTargetDragEvent e) { 
    } 
    public void dropActionChanged(DropTargetDragEvent e) { 
    } 
    public void drop(DropTargetDropEvent e) { 
    try { 
        e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); 
        java.util.List list=(java.util.List)e.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); 
        File file=(File)list.get(0); 
        OInternalFrame newOInternalFrame=new OInternalFrame(file.getName(),true,true); 
        DropTarget target=new DropTarget(newOInternalFrame.textArea,dropListner); 
        newOInternalFrame.textArea.read(new FileReader(file),null); 
        // currentFrame.textArea.read(new FileReader(file),null); 
        newOInternalFrame.textArea.setCaretPosition(0); 
        // currentFrame.textArea.setCaretPosition(0); 
        //tabbedPane2.add(add(newTabTextArea)); 
        tp.add(newOInternalFrame); 
        int tabIndex=tp.indexOfComponent(newOInternalFrame); 
        tp.setSelectedIndex(tabIndex); 
        tp.setTitleAt(tabIndex,file.getName()); 
        add(tp); 
    } 
    catch(Exception ex){} 
    } 
    } 
    } 
    

圖片:enter image description here

+0

非常感謝,它按照我的預期工作。 – user3912886 2014-09-30 09:14:00

+0

嗨,我在Stack overflow中發佈另一個問題。問題是「如何找到一個給定的字符串在一行中使用java」。我的主要主題是,我把文本文件作爲輸入,然後我檢查每一行。它是否給出了搜索字符串,如果是true,我想在控制檯上打印該行。搜索確切的單詞不是另一個單詞的子字符串,請檢查一次。 – user3912886 2014-10-01 05:27:42

0

使用下面的代碼在新標籤中打開文件。我在Method:drop(DropTargetDropEvent e)和構造函數中添加了代碼。請根據您的需要使用,更改jframe的高度和寬度。如果需要任何幫助,請回復。

import javax.swing.*; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.dnd.*; 
import java.io.File; 
import java.io.FileReader; 

public class DragAndDropFile extends javax.swing.JFrame { 
JScrollPane scrollPane; 
JTextArea textArea; 
private JTabbedPane tabbedPane2; 

public DragAndDropFile() { 

    //initComponents(); 
    textArea=new JTextArea(); 
    scrollPane=new JScrollPane(textArea); 
    tabbedPane2=new JTabbedPane(); 
    this.add(tabbedPane2); 
    enableDragAndDrop(); 

} 

private void newFileActionPerformed(java.awt.event.ActionEvent evt) { 

    //tabbedPane.add(scrollPane); 
} 

private void enableDragAndDrop() { 

     DropTarget target=new DropTarget(this,new DropTargetListener(){ 
     public void dragEnter(DropTargetDragEvent e) { 
     } 
     public void dragExit(DropTargetEvent e) { 
     } 
     public void dragOver(DropTargetDragEvent e) { 
     } 
     public void dropActionChanged(DropTargetDragEvent e) { 
     } 
     public void drop(DropTargetDropEvent e) { 
      try { 
       e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); 
       java.util.List list=(java.util.List) e.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); 
       File file=(File)list.get(0); 

       JTextArea newTabTextArea=new JTextArea(); 
       DropTarget target=new DropTarget(newTabTextArea,this); 
       newTabTextArea.read(new FileReader(file),null); 
       newTabTextArea.setCaretPosition(0); 
       tabbedPane2.add(newTabTextArea); 
       int tabIndex=tabbedPane2.indexOfComponent(newTabTextArea); 
       tabbedPane2.setSelectedIndex(tabIndex); 
       tabbedPane2.setTitleAt(tabIndex,file.getName()); 


      } 
      catch(Exception ex){} 
     } 
    }); 
} 

public static void main(String args[]) { 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(DragAndDropFile.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(DragAndDropFile.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(DragAndDropFile.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(DragAndDropFile.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 

    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new DragAndDropFile().setVisible(true); 
     } 
    }); 
} 
private javax.swing.JMenu file; 
private javax.swing.JMenuBar jMenuBar1; 
private javax.swing.JMenuItem newFile; 
private javax.swing.JTabbedPane tabbedPane; 

} 
+0

謝謝。它正在工作。 – user3912886 2014-09-27 04:10:30

+0

嗨,我試圖與我的代碼整合。它不工作。我的應用程序有兩個類。主類是OpenDemo。在這裏,請檢查openActionPerformed()方法和stateChanged()。第二個類是OInternalFrme,在此我編寫DragAndDrop()方法並從類Constructor.But中調用它,它不工作,請檢查它。謝謝你的回覆。 – user3912886 2014-09-27 05:33:35

0

回答您的集成問題。

  1. 您,是因爲您希望它們在不同的選項卡,以便改變OInternalFrame你滴法降下面

    public void drop(DropTargetDropEvent e) { 
    try { 
        e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); 
        java.util.List list=(java.util.List)e.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); 
        File file=(File)list.get(0); 
        JTextArea newTabTextArea=new JTextArea(); 
        DropTarget target=new DropTarget(newTabTextArea,this); 
        newTabTextArea.read(new FileReader(file),null); 
        newTabTextArea.setCaretPosition(0); 
        tabbedPane2.add(add(newTabTextArea)); 
        int tabIndex=tabbedPane2.indexOfComponent(newTabTextArea); 
        tabbedPane2.setSelectedIndex(tabIndex); 
        tabbedPane2.setTitleAt(tabIndex,file.getName()); 
    } 
    catch(Exception ex){} 
    

    }

  2. 每次DRAP文件時創建新文本區你沒有在你的框架中添加tabbedpane2。根據你的代碼,它看起來像你打算在內部框架中添加。但我建議加上降聽者OpenDemo幀它看起來不錯,但在的initComponents方法取決於你的requirement.add低於線

    this.add(tabbedPane2); 
    
  3. 在此之後,當您從菜單項中添加文件時,它會工作(第一個文件是不可見你應該在那工作)。那麼一旦添加了內部框架,您就可以拖放需要的文件。

4,我建議有tabbedpane2和主框架即openDemo下降監聽器,並刪除內部框架,而是取決於你的設計。

看到截圖。 enter image description here

+0

我改變了我的代碼與您的代碼suggestions.But,它不工作。我的主題是運行應用程序後,我拖放文本文件它會自動打開一個文件。例如在我的應用程序,當我點擊打開菜單它在新選項卡中打開文件。另一種情況是當我通過拖放文件打開文件 後,通過拖放文件,然後該特定文件必須在新選項卡中打開,然後打開文件。在上面的代碼中,在OpenDemo類中添加了Drap和Drop方法。請檢查一下。謝謝你爲我的任務付出努力。 – user3912886 2014-09-29 11:13:25