2013-12-17 64 views
0

問題 我正在使用Swing在java中進行文本編輯。我有一個按鈕,保存文件,使用這種方法:文本編輯器java Swing actionListener保存文件

private void save() { 
     if (savedAs) { 
      try { 
       PrintWriter fout = new PrintWriter(savedAsFile); 
       fout.print(textArea.getText()); 
       fout.close(); 
       this.setTitle("Text Editor - " + fileName); 
       saved = true; 
      } catch (FileNotFoundException ex) { 
       Logger.getLogger(TextEditorFrame.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 

savedAs布爾是真實的,只有當首次創建一個文件,否則它只是保存它,而無需打開保存爲文件選擇。當我使用的按鈕一切正常,但是當我調用save()方法從它保存鍵綁定,但由於這種方法:

private void textAreaKeyTyped(java.awt.event.KeyEvent evt) {         
    this.setTitle("Text Editor - *" + fileName); 
    saved = false; 
}   

它增加了星號回的標題。我希望它在沒有星號的情況下顯示它,因爲它已被保存。如何確保textAreaKeyTyped方法在動作偵聽器調用save方法時不會拾取輸入。

鍵綁定的ActionListener:

public void initBindings() { 
    textArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(
      KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_DOWN_MASK), "actionMapKey"); 
    textArea.getActionMap().put("actionMapKey", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      save(); 
     } 
    }); 
} 

原因 我認爲文本區域拿起造成用戶鍵入CTRL + S輸入,因此提出了星號的稱號。

謝謝!

+0

fout.print(textArea。的getText());替換爲textArea.write(更多參見API),其餘的問題不明確沒有SSCCE硬編碼字符串值爲JTextAreas模型(文檔) – mKorbel

回答

0

最可靠的方法是保持一個String lastSaved對象不一定編輯文本

  • 或者設置標題(不帶星號)等組合鍵。

    當你這樣做save()做:

    lastSaved = textArea.getText(); 
    

    然後你textAreaKeyTyped()做:

    boolean unchanged = textArea.getText.equals(lastSaved); 
    
    if (!unchanged) { 
        // add *, enable save, etc 
    } else { 
        // remove *, disable save, etc 
    } 
    

    這將有額外的好處,如果用戶反轉他們改變了他們的文件會回到一個「未修改」狀態。

    我實際上會創建一個包含該代碼的方法updateSaveState(),同時保存和修改回調調用updateSaveState(),刪除重複的代碼並將窗口標題等所有邏輯放在一個地方。

    我也很想創建一個isModified()方法,返回!textArea.getText.equals(lastSaved)並完全刪除保存的標誌。任何想知道的東西都可以撥打isModified()

    請注意,在這種情況下,編輯將不會在接收keyTyped時應用。如果你做了一個SwingUtilities.invokeLater來延遲你的處理,直到按鍵處理完成後才能解決這個問題。

  • +0

    很好解釋答案謝謝。我現在正在使用你的建議! – Cobbles

    +0

    由於某些原因,需要在添加星號之前進行兩次編輯。我不明白爲什麼? – Cobbles

    +0

    請參閱editted答案。 –

    0

    我認爲你有兩個選擇:

    1. 忽略(CTRL + S)鍵EVT在textAreaKeyTyped方法。也許也不顧你救了之後