【问题标题】:How to Drag and Drop a text file in new tab using swing如何使用 Swing 在新选项卡中拖放文本文件
【发布时间】:2014-09-25 09:52:19
【问题描述】:

我想拖放一个特定文件必须在新/单独选项卡中打开的文件。我为 DragAndDrop 编写了代码。但是当我使用 Newfile 然后我从计算机拖放文本文件时它已经工作了。它有复制或覆盖文件的内容。但是,当我拖放文件时,它应该在单独的选项卡中打开。我该怎么做。请给我建议。谢谢。我已经发布了我的原始应用程序。它有两个类。

主类:

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

【问题讨论】:

  • 谁给我答复。
  • 考虑努力发布格式良好的代码,许多人会考虑努力阅读它。请记住,我们是志愿者,如果你让人们更难理解你的代码和问题,很多人会继续回答下一个问题。
  • 我编辑了我的代码。它很容易理解。请检查一次。谢谢您的回复。
  • 任何人提出建议,如何进行上述任务。

标签: java swing file tabs drag-and-drop


【解决方案1】:

用以下代码替换您的 OpenDemo 文件: 变化是

  • 为每个 Drop 事件添加了新的内部框架
  • 在缺少的主框架中添加了 Drop 事件侦听器。
  • 在通过打开菜单项添加时在内部框架中添加了下拉列表器
  • 为 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){}
    }
    }
    }
    

图片:

【讨论】:

  • 嗨,我在堆栈溢出中发布了另一个问题。问题是“如何使用 java 在一行中找出给定的字符串”。我的主题是,我将文本文件作为输入然后我检查每一行。它是否给出了搜索字符串,如果为真我想在控制台上打印该行。搜索应该准确的单词而不是另一个单词的子字符串。请检查一次。
【解决方案2】:

使用以下代码在新选项卡中打开文件。我在 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;

}

【讨论】:

  • 嗨,我尝试与我的代码集成。它不起作用。我的应用程序有两个类。主类是 OpenDemo。在此,检查 openActionPerformed() 方法和 stateChanged()。第二个类是 OInternalFrme,在此我编写 DragAndDrop() 方法并从类 Constructor 调用它。但是,它不工作。请检查它。谢谢您的回复。
【解决方案3】:

回答您的集成问题。

  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. 你还没有在你的框架中添加 tabbedpane2 。根据您的代码,您似乎计划添加内部框架。但我建议在 OpenDemo 框架中添加 drop listener,它看起来不错,但取决于您的要求。在 initComponents 方法中添加以下行

    this.add(tabbedPane2);
    
  3. 之后,当您从菜单项添加文件时,它将起作用(第一个文件不可见,您应该处理它)。然后,一旦添加了内部框架,您就可以拖放所需的文件。

4.我建议在主框架中使用 tabbedpane2 并放置侦听器,即 openDemo 并删除内部框架,但这取决于您的设计。

查看屏幕截图。

【讨论】:

  • 我用你的代码建议更改了我的代码。但是,它不起作用。我的主题是运行应用程序后,我拖放一个文本文件,它会自动打开一个文件。例如在我的当我单击打开菜单项时,应用程序会在新选项卡中打开一个文件。另一种情况是,当我在拖放文件后通过菜单项打开文件时,该特定文件必须在新选项卡中打开,然后是已经打开的文件。上述代码中OpenDemo类中添加了Drap and Drop方法。请检查一下。感谢您为我的任务付出的努力。
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
相关资源
最近更新 更多