在jtabbedpane中处理特定文件的文档监听器?

时间:2014-10-29 10:19:13

标签: java swing jtabbedpane jinternalframe documentlistener

使用JtabbedPane在textarea中加载两个文件。使用documentlistener修改file1中的文本,不对file2进行修改但是当关闭file2的jinternalframe时,它会要求修改数据保存与否对话框以及file1常常关闭。我的问题是如何打开对话框来修改文件本身(即file1)。

这是我的代码,

public class Open extends javax.swing.JFrame {
JTextArea tx;
ArrayList<String> fileList;
File file;
String filename=null;
int i=0;
boolean update =false;
 public Open() {

   fileList=new ArrayList<String>();
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    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.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>                        

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

    final JFileChooser jc = new JFileChooser();
    int returnVal=  jc.showOpenDialog(Open.this);
    String title;
    String s=null;
    if(returnVal == JFileChooser.APPROVE_OPTION)     
    file = jc.getSelectedFile();
    if (jc.getSelectedFile()!= null) {
       BufferedReader br = null;
        StringBuffer str = new StringBuffer("");
        StringBuffer str1 = new StringBuffer("");
        StringBuilder st = new StringBuilder("");
        StringBuilder sbHex = new StringBuilder();
        StringBuilder sbText = new StringBuilder();
        StringBuilder sbResult = new StringBuilder();
        final StringBuilder pb = new StringBuilder();
        int bytesCounter =0;        
        String helloWorldInHex=null;
        int value=0;
        try {
            br = new BufferedReader(new FileReader(file));
            String line;
            try {

                    while ((line = br.readLine()) != null) {
                    str.append(line + "\n");
                }
            } 
            catch (IOException ex) {
                Logger.getLogger(Open.class.getName()).log(Level.SEVERE, null, ex);
            }
        } 
        catch (FileNotFoundException ex) {
            Logger.getLogger(Open.class.getName()).log(Level.SEVERE, null, ex);
        }
        String t = str.toString();
       filename=file.getPath();
       final JInternalFrame internalFrame = new JInternalFrame("",true,true); 
      final String filePath=file.getAbsolutePath();
      i++;
      internalFrame.setName("Doc "+i);
       tx=new JTextArea();
         internalFrame.setTitle(filename);
        try {
            internalFrame.setSelected(true);
        } 
        catch (PropertyVetoException ex) {
            Logger.getLogger(Open.class.getName()).log(Level.SEVERE, null, ex);
        }           
        tp.add(internalFrame);
        try{
            tp.setSelectedIndex(i-1);  
        }
        catch(IndexOutOfBoundsException ioe){   
        }
        tx.setText(t);
        internalFrame.add(tx);
      internalFrame.setVisible(true);

      Document doc=tx.getDocument();
      doc.addDocumentListener(new DocumentListener() {
           @Override
           public void insertUpdate(DocumentEvent e) {
            update =true;
           }

           @Override
           public void removeUpdate(DocumentEvent e) {
               update =true;
           }

           @Override
           public void changedUpdate(DocumentEvent e) {
               update =true;
           }
       });
        internalFrame.addInternalFrameListener(new InternalFrameAdapter() {
            @Override
            public void internalFrameClosing(InternalFrameEvent e) {


                String name=tx.getName();

     if(update==true){

          update=false;
        int reply = JOptionPane.showConfirmDialog(null,
                                          "Save Changes to this Document", "Quit", JOptionPane.YES_NO_CANCEL_OPTION);
           int chooserStatus;
        if (reply == JOptionPane.YES_OPTION){
          boolean success;
                String editorString;
                FileWriter fwriter;
                PrintWriter outputFile;
                try {
                    DataOutputStream d = new DataOutputStream(new FileOutputStream(filename));
                    String line = tx.getText();
                    BufferedReader br = new BufferedReader(new StringReader(line));
                    while((line = br.readLine())!=null) {
                        d.writeBytes(line + "\r\n");
                    }
                }
                catch (IOException ee) {       
                    success = false;
                }
         success = true;
                i--;
               tp.remove(internalFrame);
           }
        else if(reply==JOptionPane.NO_OPTION)
        {
            i--;
      tp.remove(internalFrame);
       }
      }
     else 
     {
          i--;
    tp.remove(internalFrame);
     }

            }
        });   

}

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

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
               try {
                UIManager.setLookAndFeel(
                           UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Open.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                Logger.getLogger(Open.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(Open.class.getName()).log(Level.SEVERE, null, ex);
            } catch (UnsupportedLookAndFeelException ex) {
                Logger.getLogger(Open.class.getName()).log(Level.SEVERE, null, ex);
            }
            new Open().setVisible(true);
        }
    });
   }
// Variables declaration - do not modify                     
private javax.swing.JMenuItem Open;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JTabbedPane tp;
// End of variables declaration                   
}

1 个答案:

答案 0 :(得分:2)

您只有一个boolean update标志,但我建议为每个文件状态分别设置一个。因此,您可以独立跟踪每个文件更改如果您有多个文件,则可以组织状态图。