2017-03-29 3 views
0

テキストエディタを開発していて、テキスト領域に入力されたチャンスを保存したかどうかを確認する必要があります。jframeを閉じる前にテキスト文書を保存したかどうかを確認する方法

スペースを入力した場合は、ダイアログが表示され、アプリケーションを閉じる前にテキストを保存するように要求されます。私はすべてのキーボードのキーを確認することなく、単一の方法で、すべてのキーを定義する必要があり

が...押されたりしていないこれは私のコードです:

private void isAnyKeyWasPressed() { 
    jTextPane1.addKeyListener(new KeyListener() { 

     @Override 
     public void keyTyped(KeyEvent e) { 
      if (e.getKeyChar()==e.VK_0 || e.getKeyChar()==e.VK_1) {//need to define all the keyboard keys without defining one by one like this 
       //my dialog box goes here 
      } 
     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 
    }); 
} 
+0

あなたは彼が救っているかどうか尋ねません、もし彼が*保存しておきたいのか尋ねてください... –

+0

あなたは私にそれについて何か助けてもらえますか? @ΦXocen웃는Пepeúpaツ –

+2

DocumentEvent/Listenerおよび/または(一緒に)DocumentFilterがJTextComponentに指定されています – mKorbel

答えて

3

あなたが正しく理解している場合は、JTextPaneの文書が編集されたかどうかを検出する方法を尋ねています。キーを聴くのは最適ではありません。私はむしろ、次のいずれかの方法をお勧めします:

A)基本となる文書への変更を聴く:isModifiedfalseに初期化する必要があり、かつ文書があるたびtrueに設定されるフィールド

jTextPanel.getDocument().addDocumentListener(new DocumentListener(){ 
     @Override 
     public void changedUpdate(DocumentEvent e) { 
      isModified=true;     
     } 

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

何とか変わった。保存したらそれをfalseにリセットする必要があります。

B)元のドキュメントのコピーを保持し、フレームが閉じようとしているときに両方を比較します。どのようにこれを行うかは、あなたが持っているドキュメントの種類に少し依存します。フレームを閉じると/編集した後

HTMLDocument doc=(HTMLDocument)jTextPanel.getDocument(); 
String originalHtml=getHTML(doc); 

:開始を編集する前に

:それはHTMLDocumentのであれば、実際のHTMLソースコードを比較すると、最も正確な方法である

HTMLDocument doc=(HTMLDocument)jTextPanel.getDocument(); 
String editedHtml=getHTML(doc); 
if(!editedHtml.equals(originalHtml)) 
    // ... text has been edited 

getHTML()方法:

public String getHTML(HTMLDocument doc){ 
    StringWriter writer = new StringWriter(); 
    kit.write(writer, doc, 0, doc.getLength()); 
    return writer.toString(); 
} 

アプローチB)の利点は、編集操作(それぞれのオーバーヘッドはほとんどの場合無視できます)を確認する必要はなく、変更が元に戻ったときを正確に検出できることです。ユーザーがテキストを追加した後、そのテキストを削除した、または取り消しが実行された)

+0

ありがとうございました。 :) –

1

あなたはキーをリッスンしたくないんイベント。

代わりに、さまざまなコンポーネントをラップするクラス内の「保存されていないプロパティ」をトラッキングする必要があります。ユーザーがに変更すると、いつでも、エディターに変更されます(具体的には、基礎となるmodelオブジェクトに変更されます)。そのプロパティをtrueに設定します。

ユーザーが保存するたびに、プロパティをfalseに変更します。

ユーザーがシャットダウンするようにアプリケーションに指示するたびに、そのプロパティをチェックし、trueの場合は、保存するかどうかをユーザーに尋ねます。

Do は、「1つのアクション」が別のアクションを直接トリガーするモードに入ります。

編集:ちょうどそれを明確にする - プロパティと私はあなたが他の答えがすでに示唆することを非常に多くisModifiedように、あなたのクラスにフィールドを追加することを意味します。

+0

保存されていないプロパティを確認するにはどうすればよいですか? –

+0

コードは正常に動作していますので、私はupvotedしましたが、私の野望はあらゆる種類のファイル(_HTMLファイルだけではありません_)です... –

+0

申し訳ありませんが、あなたは絶対に**あなた自身を過度に負担させているようです。彼はそのHTMLModelを** example **として使っています(答えは「HTMLDocumentなら答えは「!」です!)...そして、私たちはあなたが得られない本当に基本的なものをここで話しています。同じ時点で複雑なSwing UIを作成したいとします。それは動作しません。 **あなたがしていることを**理解する必要があります。 – GhostCat

関連する問題