//************************************************************* //Java application // 「SearchReplaceTest」 // //          作 成 者:ルート高菜    //          作成開始月:2006/6 //          最終更新月:2006/6 [TN088/J78] //************************************************************* import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.JTextComponent; public class SearchReplaceTest extends JFrame { //Eclipseの場合、シリアライズ可能クラスでこれがないと警告が出る private static final long serialVersionUID=0; // public static void main(String[] args) { SearchReplaceTest frame=new SearchReplaceTest(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //右上×印で終了 frame.setVisible(true); frame.setLocationRelativeTo(null); //画面の真ん中に表示 } // JTextArea area; JTextComponent textComponent; //------------------------------------ //コンストラクタ //------------------------------------ public SearchReplaceTest(){ // setTitle("SearchReplaceTest"); setSize(500,500); // area=new JTextArea(); for(int t=0;t<20;t++){ area.append("aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbccccccccccccccccccccc\n"); } textComponent=(JTextComponent)(area); JScrollPane scPanel=new JScrollPane(area); //コンテナ枠 Container cp=getContentPane(); cp.add(scPanel); //検索・置換ダイアログを作成・表示(非モーダル) SearchReplaceDialog dialog=new SearchReplaceDialog(this,"検索・置換",false); dialog.setVisible(true); } //------------------------------------ //検索・置換ダイアログ(内部クラス) //------------------------------------ class SearchReplaceDialog extends JDialog implements ActionListener,DocumentListener{ //Eclipseの場合、シリアライズ可能クラスでこれがないと警告が出る private static final long serialVersionUID=0; //親クラス SearchReplaceTest parent; // JTextField before=new JTextField(20); JTextField after=new JTextField(20); // JButton search=new JButton("次を検索"); JButton replace=new JButton("置換して次に"); JButton all=new JButton("すべて置換"); JButton cancel=new JButton("キャンセル"); //置換回数を格納(「すべて置換」で使う) int count=0; //------------------------------------ //コンストラクタ //------------------------------------ public SearchReplaceDialog(Frame owner,String title,boolean modal){ super(owner,title,modal); // parent=(SearchReplaceTest)owner; // setSize(450,150); // JPanel textPanel=new JPanel(); textPanel.add(new JLabel("検索する文字列: ")); textPanel.add(before); textPanel.add(new JLabel("置換後の文字列: ")); textPanel.add(after); // JPanel buttonPanel=new JPanel(); buttonPanel.add(search); buttonPanel.add(replace); buttonPanel.add(all); buttonPanel.add(cancel); //コンテナ枠 Container cp=getContentPane(); cp.add(textPanel,BorderLayout.CENTER); cp.add(buttonPanel,BorderLayout.SOUTH); // before.getDocument().addDocumentListener(this); search.addActionListener(this); replace.addActionListener(this); all.addActionListener(this); cancel.addActionListener(this); //最初にボタンの有効・無効を設定 enableButtons(); } //------------------------------------ //ボタンイベント //------------------------------------ public void actionPerformed(ActionEvent e){ if(e.getSource()==search){ actionSearch(true); }else if(e.getSource()==replace){ actionReplace(true); }else if(e.getSource()==all){ actionAll(); }else if(e.getSource()==cancel){ setVisible(false); } } // private boolean actionSearch(boolean messageFlag){ String nowText=parent.textComponent.getText(); String searchText=before.getText(); int startPoint=parent.textComponent.getSelectionEnd(); //選択終端(未選択ならCaret位置)から後ろへ検索 int start=nowText.indexOf(searchText,startPoint); if(start==-1){ start=nowText.indexOf(searchText); } //見つかればtrueを返す if(start!=-1){ parent.textComponent.setCaretPosition(start); parent.textComponent.moveCaretPosition(start+searchText.length()); return true; }else{ if(messageFlag){ //「すべて選択」ならダイアログを表示しない JOptionPane.showMessageDialog(this,"\""+searchText+"\"が見つかりません","TextEdit",JOptionPane.INFORMATION_MESSAGE); } return false; } } private boolean actionReplace(boolean messageFlag){ //選択済みであれば置換 String selected=parent.textComponent.getSelectedText(); if(selected!=null && selected.equals(before.getText())){ parent.textComponent.replaceSelection(after.getText()); if(!messageFlag){ //「すべて選択」なら置換回数を格納 count++; } } //次を検索(見つかればtrueを返す) return actionSearch(messageFlag); } private void actionAll(){ //なくなるまで置換 count=0; while(actionReplace(false)){ //検索でダイアログを表示させないためfalseを渡す //何もしない } // if(count>0){ JOptionPane.showMessageDialog(this,count+"個置換しました","TextEdit",JOptionPane.INFORMATION_MESSAGE); }else{ JOptionPane.showMessageDialog(this,"\""+before.getText()+"\"が見つかりません","TextEdit",JOptionPane.INFORMATION_MESSAGE); } } //------------------------------------ //テキスト編集イベント //------------------------------------ public void insertUpdate(DocumentEvent arg0) { enableButtons(); } public void removeUpdate(DocumentEvent arg0) { enableButtons(); } public void changedUpdate(DocumentEvent arg0) { } //検索文字列の入力にあわせてボタン有効・無効を設定 private void enableButtons(){ if(before.getText().equals("")){ search.setEnabled(false); replace.setEnabled(false); all.setEnabled(false); }else{ search.setEnabled(true); replace.setEnabled(true); all.setEnabled(true); } } } }