📄 textframe.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.undo.*;
//类TextFrame
public class TextFrame extends JFrame implements KeyListener{
int len=1;
int totLine=0;
File file=null;
JFileChooser jfc=new JFileChooser();
JEditorPane mainContain=new JEditorPane();
JMenuBar jmb=new JMenuBar();
JDialog jd=new JDialog(this);
JTextArea errPane = new JTextArea ((int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()/100,
(int) Toolkit.getDefaultToolkit().getScreenSize().getWidth());
MyEditorKit kit=new MyEditorKit();
JTextArea linePane=new JTextArea(24*(int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()/25,3);
String lineNumber="1\n";
Container c;
JScrollPane jsp;
JPanel cntPn;
//UndoableEditListener ue=new UndoHander();
UndoManager undo = new UndoManager();
int StartFindPos=0,a=0,b=0;
JPopupMenu popup;
JMenuItem popup_item[];
JDialog jd1=new JDialog(new JFrame(),"关于我们",false);
JDialog jd2=new JDialog(new JFrame(),"HTMLEditor帮助文档",false);
public void keyPressed(KeyEvent e){
if (e.getKeyCode()==KeyEvent.VK_ENTER){
len++;
}
else
if (e.getKeyCode()==KeyEvent.VK_BACK_SPACE||e.getKeyCode()==KeyEvent.VK_DELETE){
StringTokenizer stk=new StringTokenizer(mainContain.getText(),"\n");
if (stk.countTokens()!=len){
len=stk.countTokens();
}
}
setLineNumber();
}
private void setLineNumber(){
lineNumber="";
for (int i=1;i<=len;i++)
lineNumber=lineNumber+""+i+"\n";
linePane.setText(lineNumber);
}
public void keyReleased(KeyEvent e){
}
public void keyTyped(KeyEvent e){
}
//类的构造函数
public TextFrame(){
super("My Checker");
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e){
}
setSize((int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(),
24*(int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()/25);
linePane.setEditable(false);
linePane.setEditable(false);
popup=new JPopupMenu();
String popupOperation[]={"撤销(U)","剪贴(T)","复制(C)","粘贴(P)","删除(D)","全选(A)"};
char popupMnemonic[]={'U','T','C','P','D','A'};
popup_item=new JMenuItem[popupOperation.length];
for(int count=0;count<popupOperation.length;count++)
{
popup_item[count]=new JMenuItem(popupOperation[count]);
popup_item[count].setBackground(Color.white);
popup_item[count].setFont(new Font("Monospaced",Font.PLAIN,12));
popup_item[count].setMnemonic(popupMnemonic[count]);
popup_item[count].addActionListener(action);
if(count==1||count==5) popup.addSeparator();
popup.add(popup_item[count]);
}
mainContain.addKeyListener(this);
mainContain.setSelectedTextColor(Color.DARK_GRAY);
mainContain.addMouseListener(
new MouseAdapter(){
public void mousePressed(MouseEvent event)
{
if(event.getButton()==event.BUTTON3)
checkForTriggerEvent(event);
}
public void mouseReleased(MouseEvent event)
{
if(event.getButton()==event.BUTTON3)
checkForTriggerEvent(event);
}
private void checkForTriggerEvent(MouseEvent event)
{
if(event.isPopupTrigger())
popup.show(mainContain, event.getX(), event.getY());
}
}
);
c=getContentPane();
c.setLayout(new BorderLayout());
cntPn=new JPanel();
cntPn.setLayout(new BorderLayout());
initMenu();
initToolBar();
initAboutDialog();
initJTextArea();
mainContain.setFont(new Font("Courier New", Font.PLAIN, 20));
mainContain.setEditorKitForContentType("text/plain", kit);
mainContain.setContentType("text/plain");
linePane.setFont(new Font(null, Font.PLAIN, 20));
linePane.setRows(0);
errPane.setFont(new Font("粗体",Font.BOLD,15));
mainContain.addCaretListener(new CaretListener(){
public void caretUpdate(CaretEvent e){
}
});
cntPn.add(mainContain,BorderLayout.CENTER);
cntPn.add(linePane,BorderLayout.WEST);
jsp=new JScrollPane(cntPn);
jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED );
c.add(jsp, BorderLayout.CENTER);
}
public void init(){
TextFrame App=new TextFrame();
App.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
App.setVisible(true);
}
public JEditorPane getTextPane(){
return mainContain;
}
public JTextArea getTextArea(){
return errPane;
}
//初始化菜单
void initMenu(){
JMenu[] menus=new JMenu[]{
new JMenu("文件(F)"),
new JMenu("编辑(E)"),
//new JMenu("格式(V)"),
new JMenu("帮助(H)")
};
//以下方法设置快捷键
menus[0].setMnemonic(KeyEvent.VK_F);
menus[1].setMnemonic(KeyEvent.VK_E);
//menus[2].setMnemonic(KeyEvent.VK_V);
menus[2].setMnemonic(KeyEvent.VK_H);
JMenuItem menuitems[][]=new JMenuItem[][]{{
new JMenuItem("新建"),
new JMenuItem("打开"),
new JMenuItem("保存"),
new JMenuItem("退出")
},
{
new JMenuItem("复制"),
new JMenuItem("剪切"),
new JMenuItem("粘贴"),
new JMenuItem("查找"),
new JMenuItem("替换"),
new JMenuItem("全选"),
//new JMenuItem("撤消"),
new JMenuItem("删除")
},
//{
// new JMenuItem("自动换行"),
// new JMenuItem("字体")
// },
{
new JMenuItem("帮助主题"),
new JMenuItem("关于")
}
};
//设置加速键,其余各个类似,把它加完
menuitems[0][0].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK));
menuitems[0][1].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK));
menuitems[0][2].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK));
menuitems[0][3].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,ActionEvent.ALT_MASK));
menuitems[1][0].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK));
menuitems[1][1].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,ActionEvent.CTRL_MASK));
menuitems[1][2].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK));
menuitems[1][3].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,ActionEvent.CTRL_MASK));
menuitems[1][4].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,ActionEvent.CTRL_MASK));
menuitems[1][5].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,ActionEvent.CTRL_MASK));
//menuitems[1][6].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,ActionEvent.CTRL_MASK));
menuitems[1][6].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
menuitems[2][0].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,ActionEvent.CTRL_MASK));
for (int i=0;i<menus.length;i++){
jmb.add(menus[i]);
for (int j=0;j<menuitems[i].length;j++){
if(i==0&&j==3||i==1&&j==3||i==1&&j==6)
menus[i].addSeparator();
menus[i].add(menuitems[i][j]);
menuitems[i][j].addActionListener(action);
}
}
/*mainContain.getDocument().addUndoableEditListener(ue);
if(undo.canUndo())
{
(menuitems[1][6]).setEnabled(false);
}*/
this.setJMenuBar(jmb);
}
//菜单动作监视者
ActionListener action=new ActionListener(){
public void actionPerformed(ActionEvent e){
JMenuItem mi=(JMenuItem)e.getSource();
String id=mi.getText();
if (id.equals("新建")){
mainContain.setText("");
len=0;
setLineNumber();
file=null;
}
if (id.equals("打开")){
if(file !=null)jfc.setSelectedFile(file);
int returnVal=jfc.showOpenDialog(TextFrame.this);
if(returnVal==JFileChooser.APPROVE_OPTION){
file=jfc.getSelectedFile();
openFile();
errPane.setText("");
new Parse(mainContain,errPane);//启动检测
}
}
if(id.equals("保存")){
if (file!=null) saveFile();
else{
int returnVal=jfc.showSaveDialog(TextFrame.this);
if (returnVal==JFileChooser.APPROVE_OPTION){
file=jfc.getSelectedFile();
saveFile();
}
}
errPane.setText("");
new Parse(mainContain,errPane);//启动检测
}
else if(id.equals("退出")){
TextFrame f=new TextFrame();
int s=JOptionPane.showConfirmDialog(f,"是否需要保存?","结束程序",JOptionPane.YES_NO_CANCEL_OPTION);
if (s==JOptionPane.YES_OPTION){
jfc.setSelectedFile(file);
int returnVal=jfc.showSaveDialog(TextFrame.this);
if (returnVal==JFileChooser.APPROVE_OPTION){
file=jfc.getSelectedFile();
saveFile();}
System.exit(0);
}
if(s==JOptionPane.NO_OPTION){
System.exit(0);
}
if(s==JOptionPane.CANCEL_OPTION);
}else if(id.equals("剪切")||id.equals("剪贴(T)")){
mainContain.cut();
}else if(id.equals("复制")||id.equals("复制(C)")){
mainContain.copy();
}else if (id.equals("粘贴")||id.equals("粘贴(P)")){
mainContain.paste();
}else if(id.equals("删除")||id.equals("删除(D)")){
mainContain.cut();
}else if(id.equals("查找")){
try
{
final JDialog jd=new JDialog(new JFrame(),"查找",true);
GridBagLayout gbl=new GridBagLayout();
GridBagConstraints gbc=new GridBagConstraints();
gbc.weightx=0.5;
gbc.weighty=0.5;
gbc.gridwidth=1;
gbc.gridheight=1;
jd.getContentPane().setLayout(gbl);
jd.setSize(380,100);
jd.setResizable(false);
final JTextField jtf=new JTextField(15);
JLabel jlFind=new JLabel("查找内容:");
jd.getContentPane().add(jlFind);
JButton jbFind=new JButton("查找");
jbFind.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent efind)
{
String strA=mainContain.getText();
String strB=jtf.getText();
if(a>=0)
{
a=strA.indexOf(strB,StartFindPos);
b=strB.length();
StartFindPos=a+b;
if(a==-1)
{
JOptionPane.showMessageDialog(null, "没有您要查找的信息", "查找结果",1);
a=0;
StartFindPos=0;
}
mainContain.select(a,StartFindPos);
}
}
}
);
JButton jbCancel=new JButton("取消");
jbCancel.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ejb)
{
jd.dispose();
}
}
);
jd.getContentPane().add(jtf);
jd.getContentPane().add(jbFind);
jd.getContentPane().add(jbCancel);
// jd.setResizable(false);
jd.setLocation(240,200);
jd.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
jd.setVisible(true);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -