引用页_初学Java:仿写记事本_Replace.java

原创 2012年03月22日 20:26:13

<< 返回
  

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class Replace extends JDialog {
	private Replace myself = null;
	private Notepad notepad = null;
	private JTextField textFrom = null;
	private JLabel labelFrom = null;
	private JButton findNext = null;
	private JTextField textTo = null;
	private JLabel labelTo = null;
	private JButton cancel = null;
	private JCheckBox care = null;
	private JPanel panel_Care = null;
	private JButton replace = null;
	private JButton replaceAll = null;
	private boolean isCare = false;
	
	public Replace(Notepad notepad) {
		this.myself = this;
		this.notepad = notepad;
		this.setLayout(null);
		this.getReady();
		this.addEvent();
		this.fillText();
		this.setVisible(true);
	}
	
	private void getReady() {
		this.labelFrom = new JLabel("查找内容:");
		this.labelFrom.setSize(100, 25);
		this.labelFrom.setLocation(10, 5);
		this.labelFrom.setFont(new Font("宋体", 0, 12));
		
		this.labelTo = new JLabel("替换为:");
		this.labelTo.setSize(100, 25);
		this.labelTo.setLocation(10, 35);
		this.labelTo.setFont(new Font("宋体", 0, 12));
		
		this.textFrom = new JTextField();
		this.textFrom.setSize(170, 25);
		this.textFrom.setLocation(100, 5);
		this.textFrom.setFont(new Font("宋体", 0, 12));
		
		this.textTo = new JTextField();
		this.textTo.setSize(170, 25);
		this.textTo.setLocation(100, 35);
		this.textTo.setFont(new Font("宋体", 0, 12));
		
		this.findNext = new JButton("查找下一个");
		this.findNext.setSize(100, 25);
		this.findNext.setLocation(280, 5);
		this.findNext.setEnabled(false);
		
		this.replace = new JButton("替换");
		this.replace.setSize(100, 25);
		this.replace.setLocation(280, 35);
		this.replace.setEnabled(false);
		
		this.replaceAll = new JButton("全部替换");
		this.replaceAll.setSize(100, 25);
		this.replaceAll.setLocation(280, 65);
		this.replaceAll.setEnabled(false);
		
		this.cancel = new JButton("取消");
		this.cancel.setSize(100, 25);
		this.cancel.setLocation(280, 95);
		
		this.care = new JCheckBox("区分大小写");
		this.care.setSelected(false);
		this.panel_Care = new JPanel();
		this.panel_Care.add(this.care);
		this.panel_Care.setSize(80, 50);
		this.panel_Care.setLocation(10, 95);
		
		this.setSize(400, 160);
		this.setLocation(400, 300);
		this.setResizable(false);
		this.setTitle("替换");
		
		this.add(this.labelFrom);
		this.add(this.labelTo);
		this.add(this.textTo);
		this.add(this.textFrom);
		this.add(this.findNext);
		this.add(this.replace);
		this.add(this.replaceAll);
		this.add(this.cancel);
		this.add(this.panel_Care);
		
		this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
	}
	
	private void addEvent() {
		this.textFrom.addKeyListener(new TextKeyListener(this));
		this.textFrom.addMouseListener(new TextMouseListener(this));
		this.care.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						myself.isCare = care.isSelected();
					}
				});
		this.findNext.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						findNext(textFrom.getText(), notepad.getTextArea().getCaretPosition(), isCare);
						notepad.setFindStr(textFrom.getText());
					}
				});
		this.replace.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						if (notepad.getTextArea().getSelectedText() == null || "".equals(notepad.getTextArea().getSelectedText())) {
							findNext(textFrom.getText(), notepad.getTextArea().getCaretPosition(), isCare);
							return;
						} else {
							if (!notepad.getTextArea().getSelectedText().equals(textFrom.getText())) {
								// 如果当前选中的和textFrom中的内容不一样,就不能把它替换掉,要当前位置重新查找
								findNext(textFrom.getText(), notepad.getTextArea().getCaretPosition(), isCare);
								return;
							}
						}
						if (textTo.getText() == null) textTo.setText("");	// 防止空指向异常
						notepad.getTextArea().replaceSelection(textTo.getText());	// 替换完成
						findNext(textFrom.getText(), notepad.getTextArea().getCaretPosition(), isCare);
						notepad.setFindStr(textFrom.getText());
						notepad.setReplaceStr(textTo.getText());
					}
				});
		this.replaceAll.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						if (textTo.getText() == null) textTo.setText("");	// 防止空指向异常
						notepad.getTextArea().setCaretPosition(0);
						findNext(textFrom.getText(), notepad.getTextArea().getCaretPosition(), isCare);
						while (true) {
							if (!notepad.getTextArea().getSelectedText().equals(textFrom.getText())) return;
								// 如果没有这句,会造成死循环,我没时间去看为什么,直接规避吧,嗯……
							System.out.println("选中了:[" + notepad.getTextArea().getSelectedText() + "]");
							if (notepad.getTextArea().getSelectedText() == null || "".equals(notepad.getTextArea().getSelectedText())) return;
							
							notepad.getTextArea().replaceSelection(textTo.getText());	// 替换完成
							findNext(textFrom.getText(), notepad.getTextArea().getCaretPosition(), isCare);
							if (notepad.getTextArea().getCaretPosition() >= notepad.getTextArea().getText().length()) {
								System.out.println("退出循环");
								return;
							}
						}
					}
				});
		this.cancel.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						myself.dispose();
					}
				});
	}
	
	private void findNext(String str, int currentIndex, boolean isCare) {
		if (str == null || "".equals(str) || currentIndex < 0 || currentIndex > notepad.getTextArea().getText().length()) {
			System.err.println("异常!\nFind.java: findNext()");
			return;
		}
		if (isCare) {	// 如果区分大小写
			notepad.getTextArea().setSelectionStart(notepad.getTextArea().getText().indexOf(str, currentIndex));
			notepad.getTextArea().setSelectionEnd(notepad.getTextArea().getText().indexOf(str, currentIndex) + str.length());
		} else {		// 如果不区分大小写
			notepad.getTextArea().setSelectionStart(notepad.getTextArea().getText().toUpperCase().indexOf(str.toUpperCase(), currentIndex));
			notepad.getTextArea().setSelectionEnd(notepad.getTextArea().getText().toUpperCase().indexOf(str.toUpperCase(), currentIndex) + str.length());
		}
	}
	
	private void fillText() {
		if (this.notepad.getTextArea().getSelectedText() != null
				&& !("".equals(this.notepad.getTextArea().getSelectedText()))) {
			this.textFrom.setText(this.notepad.getTextArea().getSelectedText());
		} else if (this.notepad.getFindStr() != null
				&& !("".equals(this.notepad.getFindStr()))) {
			this.textFrom.setText(this.notepad.getFindStr());
		} 
	}
	
	public JTextField getTextField() {
		return this.textFrom;
	}
	
	public JButton getButton(int num) {
		if (num == 1) return this.findNext;
		if (num == 2) return this.replace;
		if (num == 3) return this.replaceAll;
		return null;
	}
}

  
<< 返回

相关文章推荐

引用页_初学Java:仿写记事本_OpenFile.java

返回    import java.io.File; import java.io.FileReader; import java.io.Reader; import javax.swing...
  • Tieper
  • Tieper
  • 2012年03月22日 20:23
  • 289

引用页_初学Java:仿写记事本_Notepad.java

返回    import java.awt.BorderLayout; import java.awt.Font; import java.awt.event.ActionEvent; impor...
  • Tieper
  • Tieper
  • 2012年03月22日 20:22
  • 304

引用页_初学Java:仿写记事本_TextKeyListener.java

返回    /** * 为了状态栏功能而设立的监听类 * 第一次改写: * 同时也适用于对“编辑”-“删除”菜单的可用设置 * 第二次改写: * 同时也适用于对“格式”-“字体”...
  • Tieper
  • Tieper
  • 2012年03月22日 20:31
  • 256

引用页_初学Java:仿写记事本_SaveFile.java

返回    import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; import ja...
  • Tieper
  • Tieper
  • 2012年03月22日 20:28
  • 167

引用页_初学Java:仿写记事本_GoDialog.java

返回    import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListene...
  • Tieper
  • Tieper
  • 2012年03月22日 20:12
  • 193

引用页_初学Java:仿写记事本_Find.java

返回    import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListene...
  • Tieper
  • Tieper
  • 2012年03月22日 20:08
  • 201

引用页_初学Java:仿写记事本_TextMouseListener.java

返回    /** * 为了状态栏功能而设立的监听类 * 第一次改写: * 同时也适用于对“编辑”-“删除”菜单的可用设置 * 第二次改写: * 同时也适用于对“格式”-“字体”...
  • Tieper
  • Tieper
  • 2012年03月22日 20:32
  • 164

初学Java:仿写记事本

一、前言      纸上得来终觉浅,绝知此事要躬行。   自学Java已经有一段时间了,最近读完了李兴华老师的《Java开发实战经典》一书,受益匪浅。感觉其中的知识比较全面,实用性也比较高,为了...
  • Tieper
  • Tieper
  • 2012年03月22日 19:52
  • 411

Java Swing写的字体选择器,仿记事本中的字体控件

Java Swing 写的字体选择器,仿记事本中的字体控件,使用操作方法与文件选择器JFileChooser基本相同。   import java.awt.BorderLayout; i...
  • ycb1689
  • ycb1689
  • 2012年12月19日 09:15
  • 1969

Java仿Windows记事本源代码

先上截图: 源代码:import java.awt.*; import javax.swing.*; import javax.swing.filechooser.FileNameExt...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:引用页_初学Java:仿写记事本_Replace.java
举报原因:
原因补充:

(最多只允许输入30个字)