java - 使用java swing我在jtextarea中打开了一个文本文件,关闭它后JoptionPane对话框总是出现

标签 java swing joptionpane jdialog jinternalframe

我将一个文本文件加载到 jtextarea 中,然后修改了其内容,但是当我关闭它时,jinternalframe 会关闭,但即使我不修改文本,也始终显示对话框。 这是我的问题,因为我希望仅在修改文本时才出现该对话框。

如何测试这种情况?

这是我的代码:

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

    // <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 ) {
    filename=file.getPath();
        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(Exception e)

        {

        }
        String t = str.toString();
        final JInternalFrame internalFrame = new JInternalFrame("",true,true); 
        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);
        }           
        tx.setText(t);
        internalFrame.add(tx);
        tp.add(internalFrame);
        try{
            tp.setSelectedIndex(i-1);  
        }
        catch(IndexOutOfBoundsException ioe){   
        }
     internalFrame.setTitle(filename);
        tp.add(internalFrame);
        try {
            tp.setSelectedIndex(i-1);  
        }
        catch(IndexOutOfBoundsException ioe){      
        }
        internalFrame.setVisible(true);
        internalFrame.addInternalFrameListener(new InternalFrameAdapter() {
            @Override
            public void internalFrameClosing(InternalFrameEvent e) {
                String name=tx.getName();

      if(tx.getText().length()>0){
        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);

        }
      }

            }
        });   

    }

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

有什么建议吗?

最佳答案

您应该使用文档监听器而不是 if...else。使用 boolean 变量检查文件是否被修改,如果该文件被修改,则打开对话框,否则关闭框架。

更新 为了澄清代码,我更新了代码,请检查更新后的代码

boolean updated = false;       //instance variable

    public Class_name()            //would be your constructor or you can put code in initializing method
    {

        TextArea tx = new TextArea();
        Document doc = tx.getDocument();
        doc.addDocumentListener(this);

        internalFrame.addWindowListener(new WindowAdapter()
        {
              public void windowClosing(WindowEvent e)
              {
                    if(updated)
                    {
                        //show dialog box and save changes
                        internalFrame.dispose();
                    }
                    else
                        internalFrame.dispose();
              }
        });
    }   
        after that add use this code in overridden methods
        public void insertUpdate(DocumentEvent e)
        {
             updated = true;
        }
        public void removeUpdate(DocumentEvent e)
        {
             updated = true;
        }
        public void changeUpdate(DocumentEvent e)
        {
             updated = true;
        }

关于java - 使用java swing我在jtextarea中打开了一个文本文件,关闭它后JoptionPane对话框总是出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26545906/

相关文章:

java - postman 显示错误 : format not supported by the requested resource

java - JTable 移动屏幕/指针来搜索文本

java - 验证输入对话框

java - AndEngine - 一般 2D 横向卷轴问题

java - 为什么 Java 中第一次调用方法时会产生运行时开销?

java - 这是不好的做法吗?多个 Graphics2D 对象

java - 按下按钮时偶尔更新 JList

java - 如果语句没有运行

java - 如何将 ResultSet 响应传递给 JOptionPane showMessageDialog

java - 使用 rJava 将 String[][] 从 Java 传递到 R 时出现问题