JAVA中怎么运用多线程来构造记事本,完成记事本的基本功能。
多线程构造记事本是什么意思?单线程就可以了。
package java3.T10;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.nio.charset.Charset;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
public class NotePad extends JFrame implements ActionListener{
/*
* 实现记事本的功能
* */
JMenuBar menuBar; //菜单条
JMenu mFile,mEdit; //子菜单
JMenuItem miNew,miOpen,miSave,miExit; //菜单项
JMenuItem miCut,miCopy,miPaste; //菜单项
//文本区域框
JTextArea txtContent;
public NotePad() {
super("记事本2020");
//创建菜单项
miNew = new JMenuItem("新建");
/*
* setAccelerator:设置快捷键
* 第一个参数对应键盘的键
* 第二个参数就是控制键
* SHIFT == 1
* CTRL == 2
* CTRL+SHIFT == 3
* ALT == 8
*
*
* */
miNew.setAccelerator(KeyStroke.getKeyStroke('N', 2));
miOpen = new JMenuItem("打开");
miSave = new JMenuItem("保存");
miExit = new JMenuItem("退出");
//注册Action事件
miNew.addActionListener(this);
miOpen.addActionListener(this);
miSave.addActionListener(this);
miExit.addActionListener(this);
//创建子菜单
mFile = new JMenu("文件");
//把菜单项添加到子菜单
mFile.add(miNew);
mFile.add(miOpen);
mFile.add(miSave);
//添加分隔条
mFile.addSeparator();
mFile.add(miExit);
miCut = new JMenuItem("剪切");
miCopy = new JMenuItem("拷贝");
miPaste = new JMenuItem("粘贴");
mEdit = new JMenu("编辑");
mEdit.add(miCut);
mEdit.add(miCopy);
mEdit.add(miPaste);
miCut.addActionListener(this);
miCopy.addActionListener(this);
miPaste.addActionListener(this);
//创建菜单条
menuBar = new JMenuBar();
//把子菜单添加到菜单条
menuBar.add(mFile);
menuBar.add(mEdit);
//菜单条添加到窗口
setJMenuBar(menuBar);
txtContent = new JTextArea();
//添加到窗口,添加滚动条
/*
* 垂直滚动条一直出现:JScrollPane.VERTICAL_SCROLLBAR_ALWAYS
* 垂直滚动条从来不出现:JScrollPane.VERTICAL_SCROLLBAR_NEVER
* 垂直滚动条需要的时候自动出现(默认值):JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
*
* 水平滚动条
* 垂直滚动条一直出现:JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
* 垂直滚动条从来不出现:JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
* 垂直滚动条需要的时候自动出现(默认值):JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
* */
add(new JScrollPane(txtContent));
setSize(500,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
public static void main(String[] args) {
new NotePad();
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == miNew) {
JOptionPane.showMessageDialog(null, "新建文件");
//清空文本框内容
txtContent.setText("");
}else if (e.getSource() == miOpen) {
//打开文件
JFileChooser dlg = new JFileChooser();
//设置对话框类型,为打开文件
dlg.setDialogType(JFileChooser.OPEN_DIALOG);
//打开对话框
dlg.showOpenDialog(null);
//获取选中的文件
File file =dlg.getSelectedFile();
//打开文件
try {
BufferedReader br = new BufferedReader(new FileReader(file));
//读文件内容
String txt = "";
//循环读取文件内容,循环一次读一行
while ((txt = br.readLine()) !=null) {
// txt = new String(txt.getBytes("GB2312"),"utf-8");
txtContent.append(txt + "\n");
}
//关闭
br.close();
}catch(Exception ex) {
ex.printStackTrace();
}
}else if(e.getSource() == miSave) {
//保存文件
//打开文件
JFileChooser dlg = new JFileChooser();
//设置对话框类型,为打开文件
dlg.setDialogType(JFileChooser.SAVE_DIALOG);
//打开对话框
dlg.showSaveDialog(null);
File file = dlg.getSelectedFile();
//获取文件名称
String fileName = file.getAbsolutePath();
//判断文件是否包含扩展名,indexOf返回指定字符在字符串中的索引,如果没有则返回-1
if(fileName.indexOf('.') == -1) {
fileName += ".txt";
}
//读取文本框内容
String txt = txtContent.getText();
//打开输出流保存文件
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
bw.write(txt);
bw.flush();
bw.close();
}catch(Exception ex) {
ex.printStackTrace();
}
} else if (e.getSource() == miExit) {
/*
* 错误图标:JOptionPane.ERROR_MESSAGE
* 信息图标:JOptionPane.INFORMATION_MESSAGE
* 警告图标:JOptionPane.Warning_MESSAGE
* 提问图标:JOptionPane.QUESTION_MESSAGE
* */
Icon icon = new ImageIcon("upload/touxiang.png");
// JOptionPane.showConfirmDialog(null, "退出确认?");
//如果点击了确认就退出
if(JOptionPane.showConfirmDialog(null, "退出确认?","退出",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,icon) == JOptionPane.OK_OPTION) {
System.exit(0);
}
}else if(e.getSource() == miCopy) {
//获取被选中的文本内容
String txt = txtContent.getSelectedText();
//获取系统的剪切板
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
//把选中的内容转换为Transferable对象
Transferable trans = new StringSelection(txt);
//设置到剪切板
clip.setContents(trans, null);
} else if(e.getSource() == miCut) {
//获取被选中的文本内容
String txt = txtContent.getSelectedText();
//获取系统的剪切板
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
//把选中的内容转换为Transferable对象
Transferable trans = new StringSelection(txt);
//设置到剪切板
clip.setContents(trans, null);
//获取光标在文本框中的位置
int pos = txtContent.getCaretPosition();
//被选中文字前面的内容
String prefix = txtContent.getText().substring(0,pos-txt.length());
int len = txtContent.getText().length();
if(pos < len) {
//取被选中文字后面的内容
prefix += txtContent.getText().substring(pos);
}
//更新文本框的内容
txtContent.setText(prefix);
}else if(e.getSource() == miPaste) {
//获取剪切板内容
String txt = getCopyText();
//获取文本框的内容
String temp = txtContent.getText();
//获取光标位置
int pos = txtContent.getCaretPosition();
//读取光标前面的内容 + 剪切板的内容
txt = temp.substring(0, pos) + txt;
if(pos <temp.length()) //光标不在内容的最后位置
txt += temp.substring(pos);
//更新文本框内容
txtContent.setText(txt);
}
}
//获取剪切板的内容
public static String getCopyText() {
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();//获取剪切板
Transferable trans = clip.getContents(null);//获取内容
if (trans != null)
//判断是否支持文本
if (trans.isDataFlavorSupported(DataFlavor.stringFlavor))
//获取并返回
try {
return (String) trans.getTransferData(DataFlavor.stringFlavor);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
package java3.T10;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.nio.charset.Charset;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
public class NotePad extends JFrame implements ActionListener{
/*
* 实现记事本的功能
* */
JMenuBar menuBar; //菜单条
JMenu mFile,mEdit; //子菜单
JMenuItem miNew,miOpen,miSave,miExit; //菜单项
JMenuItem miCut,miCopy,miPaste; //菜单项
//文本区域框
JTextArea txtContent;
public NotePad() {
super("记事本2020");
//创建菜单项
miNew = new JMenuItem("新建");
/*
* setAccelerator:设置快捷键
* 第一个参数对应键盘的键
* 第二个参数就是控制键
* SHIFT == 1
* CTRL == 2
* CTRL+SHIFT == 3
* ALT == 8
*
*
* */
miNew.setAccelerator(KeyStroke.getKeyStroke('N', 2));
miOpen = new JMenuItem("打开");
miSave = new JMenuItem("保存");
miExit = new JMenuItem("退出");
//注册Action事件
miNew.addActionListener(this);
miOpen.addActionListener(this);
miSave.addActionListener(this);
miExit.addActionListener(this);
//创建子菜单
mFile = new JMenu("文件");
//把菜单项添加到子菜单
mFile.add(miNew);
mFile.add(miOpen);
mFile.add(miSave);
//添加分隔条
mFile.addSeparator();
mFile.add(miExit);
miCut = new JMenuItem("剪切");
miCopy = new JMenuItem("拷贝");
miPaste = new JMenuItem("粘贴");
mEdit = new JMenu("编辑");
mEdit.add(miCut);
mEdit.add(miCopy);
mEdit.add(miPaste);
miCut.addActionListener(this);
miCopy.addActionListener(this);
miPaste.addActionListener(this);
//创建菜单条
menuBar = new JMenuBar();
//把子菜单添加到菜单条
menuBar.add(mFile);
menuBar.add(mEdit);
//菜单条添加到窗口
setJMenuBar(menuBar);
txtContent = new JTextArea();
//添加到窗口,添加滚动条
/*
* 垂直滚动条一直出现:JScrollPane.VERTICAL_SCROLLBAR_ALWAYS
* 垂直滚动条从来不出现:JScrollPane.VERTICAL_SCROLLBAR_NEVER
* 垂直滚动条需要的时候自动出现(默认值):JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
*
* 水平滚动条
* 垂直滚动条一直出现:JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
* 垂直滚动条从来不出现:JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
* 垂直滚动条需要的时候自动出现(默认值):JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
* */
add(new JScrollPane(txtContent));
setSize(500,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
public static void main(String[] args) {
new NotePad();
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == miNew) {
JOptionPane.showMessageDialog(null, "新建文件");
//清空文本框内容
txtContent.setText("");
}else if (e.getSource() == miOpen) {
//打开文件
JFileChooser dlg = new JFileChooser();
//设置对话框类型,为打开文件
dlg.setDialogType(JFileChooser.OPEN_DIALOG);
//打开对话框
dlg.showOpenDialog(null);
//获取选中的文件
File file =dlg.getSelectedFile();
//打开文件
try {
BufferedReader br = new BufferedReader(new FileReader(file));
//读文件内容
String txt = "";
//循环读取文件内容,循环一次读一行
while ((txt = br.readLine()) !=null) {
// txt = new String(txt.getBytes("GB2312"),"utf-8");
txtContent.append(txt + "\n");
}
//关闭
br.close();
}catch(Exception ex) {
ex.printStackTrace();
}
}else if(e.getSource() == miSave) {
//保存文件
//打开文件
JFileChooser dlg = new JFileChooser();
//设置对话框类型,为打开文件
dlg.setDialogType(JFileChooser.SAVE_DIALOG);
//打开对话框
dlg.showSaveDialog(null);
File file = dlg.getSelectedFile();
//获取文件名称
String fileName = file.getAbsolutePath();
//判断文件是否包含扩展名,indexOf返回指定字符在字符串中的索引,如果没有则返回-1
if(fileName.indexOf('.') == -1) {
fileName += ".txt";
}
//读取文本框内容
String txt = txtContent.getText();
//打开输出流保存文件
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
bw.write(txt);
bw.flush();
bw.close();
}catch(Exception ex) {
ex.printStackTrace();
}
} else if (e.getSource() == miExit) {
/*
* 错误图标:JOptionPane.ERROR_MESSAGE
* 信息图标:JOptionPane.INFORMATION_MESSAGE
* 警告图标:JOptionPane.Warning_MESSAGE
* 提问图标:JOptionPane.QUESTION_MESSAGE
* */
Icon icon = new ImageIcon("upload/touxiang.png");
// JOptionPane.showConfirmDialog(null, "退出确认?");
//如果点击了确认就退出
if(JOptionPane.showConfirmDialog(null, "退出确认?","退出",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,icon) == JOptionPane.OK_OPTION) {
System.exit(0);
}
}else if(e.getSource() == miCopy) {
//获取被选中的文本内容
String txt = txtContent.getSelectedText();
//获取系统的剪切板
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
//把选中的内容转换为Transferable对象
Transferable trans = new StringSelection(txt);
//设置到剪切板
clip.setContents(trans, null);
} else if(e.getSource() == miCut) {
//获取被选中的文本内容
String txt = txtContent.getSelectedText();
//获取系统的剪切板
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
//把选中的内容转换为Transferable对象
Transferable trans = new StringSelection(txt);
//设置到剪切板
clip.setContents(trans, null);
//获取光标在文本框中的位置
int pos = txtContent.getCaretPosition();
//被选中文字前面的内容
String prefix = txtContent.getText().substring(0,pos-txt.length());
int len = txtContent.getText().length();
if(pos < len) {
//取被选中文字后面的内容
prefix += txtContent.getText().substring(pos);
}
//更新文本框的内容
txtContent.setText(prefix);
}else if(e.getSource() == miPaste) {
//获取剪切板内容
String txt = getCopyText();
//获取文本框的内容
String temp = txtContent.getText();
//获取光标位置
int pos = txtContent.getCaretPosition();
//读取光标前面的内容 + 剪切板的内容
txt = temp.substring(0, pos) + txt;
if(pos <temp.length()) //光标不在内容的最后位置
txt += temp.substring(pos);
//更新文本框内容
txtContent.setText(txt);
}
}
//获取剪切板的内容
public static String getCopyText() {
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();//获取剪切板
Transferable trans = clip.getContents(null);//获取内容
if (trans != null)
//判断是否支持文本
if (trans.isDataFlavorSupported(DataFlavor.stringFlavor))
//获取并返回
try {
return (String) trans.getTransferData(DataFlavor.stringFlavor);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632