2014-10-30 63 views
0

打开两个文件通过使用Jtabbedpane.Document侦听器独立工作每个文件。如果修改了仅针对特定文件启用的一个文件文件侦听器。这个怎么做?。当打开两个文件如何使用jtabbedpane工作documentlistener?

这里是我的代码,

import java.beans.PropertyVetoException; 
import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.StringReader; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFileChooser; 
import javax.swing.JInternalFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.event.InternalFrameAdapter; 
import javax.swing.event.InternalFrameEvent; 
import javax.swing.text.Document; 

public class Close extends javax.swing.JFrame { 
JTextArea tx; 

File file; 
String filename=null; 
int i=0; 
boolean update =false; 
public Close() { 
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(Close.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

哇,这就像这个问题第10次被问到。每个标签的内容应该是一个独立的工作单元,不需要知道任何其他标签或其内容。为此,您应该创建一个单独的“编辑器”类,它包含对文件,视图(文本编辑器)和“DocumentListener”的引用,它应该提供允许外部类查询关于状态的功能的内容(更改或不),甚至可以提供'ChangeListener'支持... – MadProgrammer 2014-10-30 06:14:04

+0

我是新来的秋千。你可以提供任何相关的例子或链接:@ MadProgrammer – user3531731 2014-10-30 06:17:36

+0

[使用JFC/Swing创建GUI](http://docs.oracle.com/javase/tutorial/uiswing/) – MadProgrammer 2014-10-30 06:18:14

回答

0
public class Open extends javax.swing.JFrame { 
    JTextArea tx; 
    ArrayList<String> fileList; 
    File file; 
    Map<Integer,String> m; 
    Map<String,Boolean> m1; 
    String filename=null; 
    int i=0; 
    int j=-1; 
    boolean update =false; 
    boolean changed=false; 
public Open() { 

    fileList=new ArrayList<String>(); 
    m=new HashMap<Integer,String>(); 
     m1=new HashMap<String, Boolean>(); 
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); 
    final Document doc=tx.getDocument(); 

      doc.addDocumentListener(new DocumentListener() { 
      @Override 
      public void insertUpdate(DocumentEvent e) { 
       System.out.println("insert"); 


      Component c = tp.getSelectedComponent(); 
     if(c instanceof JInternalFrame) 
     { 
      JInternalFrame f = (JInternalFrame)c; 
      if(!fileList.contains(f.getTitle())) 
      { 


       fileList.add(f.getTitle()); 
       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(); 

       Component c = tp.getSelectedComponent(); 
     if(c instanceof JInternalFrame) 
     { 
      JInternalFrame f = (JInternalFrame)c; 

     String path=f.getTitle(); 


     if(fileList.contains(path)){ 
      fileList.remove(path); 


      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 { 
        FileOutputStream fos = new FileOutputStream(filename); 
        DataOutputStream d = new DataOutputStream(fos); 
        System.out.println("conetent2   "+filename); 

        String line = tx.getText(); 
        System.out.println("conetent   "+line); 
        BufferedReader br = new BufferedReader(new StringReader(line)); 
        while((line = br.readLine())!=null) { 
         d.writeBytes(line + "\r\n"); 
        } 

       } 
       catch (IOException ee) {  
        System.out.println("conetent  qqw112222  "); 
        success = false; 
       } 

     success = true; 
       i--; 
       tp.remove(internalFrame); 
      } 
     else if(reply==JOptionPane.NO_OPTION) 
     { 
      i--; 
     tp.remove(internalFrame); 
     } 
     } 

    else 
    { 

      i--; 
    tp.remove(internalFrame); 
    } 
     }  
      } 
     }); 


    j++; 



    } 

    }          
    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     
}