【问题标题】:Using java swing I opened a text file into jtextarea, after closing it JoptionPanedialog box always appear使用 java swing 我在 jtextarea 中打开了一个文本文件,关闭它后 JoptionPanedialog 框总是出现
【发布时间】:2014-10-24 10:11:02
【问题描述】:

我将一个文本文件加载到 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                   
}

有什么建议吗?

【问题讨论】:

  • 能否请您发布您的整个代码,以便我们了解为什么仍然弹出消息框。
  • 刚刚发布完整代码@VighaneshGursale
  • 在你真正需要之前不要设置setVisible(true)。将 setVisible(true) 作为if(tx.getText().length()&gt;0)中的第一行
  • if(tx.getText().length()>0) 此条件引发对话框进行修改,但我需要什么条件替换它?修改文件需要对话框,不修改文本没有出现对话框。 @VighaneshGursale
  • 我没收到?我与 JoptionPaneDialog @hagubear 相关的问题

标签: java swing joptionpane jdialog jinternalframe


【解决方案1】:

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

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

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

【讨论】:

  • 在 internalframe 监听器中,添加 documentlistener 不起作用。
  • 通过textarea 使用文档侦听器。把文档监听器放到TextArea里面JInternalFrame。
  • 它不工作。如果可能,请发布完整的代码。
  • 请检查更新后的代码,不要指望每个人都会在这里为您提供完整的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多