我写了一个记事本,在菜单中添加了删除,复制,剪贴等,并且给它们分别付给快捷键,DELETE,CTRL+C,CTRL+V等,
但是我点击菜单中的删除,复制等,文本框中的类容并没有改变,但是按下不同的快捷键却又变化(这好像都是系统默认的,不是我编写的),好像就是我写的删除,复制,等和系统的配置的默认快捷键不搭配,怎么样能使它们配合在一起,急求~~~~~~~~~~
但是我点击菜单中的删除,复制等,文本框中的类容并没有改变,但是按下不同的快捷键却又变化(这好像都是系统默认的,不是我编写的),好像就是我写的删除,复制,等和系统的配置的默认快捷键不搭配,怎么样能使它们配合在一起,急求~~~~~~~~~~
解决方案 »
- java this变量指向对象本身,一个类可以通过this变量来获得一个代表它自身的对象变量。什么意思?
- 莫非这几种语言真的廉颇老矣,善可喝粥?
- [求助]SWT中Tree控件的使用,如何实现鼠标对节点拖拽的操作
- 游戏开发
- 一个没有人回答的问题!!
- 怎样判断jtree和jlist中选中的值将要发生改变
- 有人用过JList吗?
- 我从jbuilder8安装后考下来的jdk1.4为什么不能在我的系统中配置啊? 急
- 我下载了jdk1.3.1,用记事本编了一个最简单的类,保存,编译没错生成.class,但是我用java .class时出现了错误,是怎么回事?
- 关于jdk运行问题
- ?请教关于main函数的args参数问题?
- 小弟初学线程就遇到问题
javax.swing.text.JTextComponent
所有已实现的接口:
ImageObserver, MenuContainer, Serializable, Accessible, Scrollable
直接已知子类:
JEditorPane, JTextArea, JTextField --------------------------------------------------------------------------------public abstract class JTextComponentextends JComponentimplements Scrollable, AccessibleJTextComponent 是 swing 文本组件的基类。它会试着与 java.awt.TextComponent 类兼容,并且在此理应如此。还提供其他额外灵活性(不包括可插入 UI 和 bean 支持)服务。有关如何使用此类提供的功能的信息,请参阅《The Java Tutorial》中的 General Rules for Using Text Components 一节。
插入符更改
插入符是 swing 文本组件中的可插入对象。将插入符位置和选择的更改通知发送到已向文本组件注册的 CaretListener 接口的实现。如果尚未设置自定义插入符,则该 UI 将安装默认插入符。
默认情况下,该插入符会跟踪在事件指派线程上执行的所有更改,并且如果插入发生在插入符位置或之前,或者移除发生在插入符位置之前,则相应地更新其位置。DefaultCaret 会试着弄清会不会导致 JScrollPane 内的文本组件的滚动。DefaultCaret.setUpdatePolicy(int) 方法可以更改默认的插入符行为。
注:不可编辑的文本组件也有插入符,尽管可能不绘制它。 命令
文本组件提供许多可能用于操作组件的命令。这实质上是组件表示其功能的方式。这些都将根据 swing Action 接口使用 TextAction 实现来表示。文本组件支持的命令集合可以使用 getActions() 方法查找。这些操作可以绑定到由按键等激发的键事件上。 文本输入
文本组件支持灵活而且国际化的文本输入,在使用 keymap 和输入法框架的同时维护与 AWT 侦听器模型的兼容性。
Keymap 让应用程序将击键绑定到操作上。为了允许 keymap 在整个多文本组件上共享,它们可以使用扩展 TextAction 的操作。TextAction 可以确定哪个 JTextComponent 最近有或以前有过焦点,并因此成为该操作的执行者(在此情况下,发送到该操作的 ActionEvent 不包含作为其源的目标文本组件)。 input method framework 让文本组件与输入法交互,分隔预处理事件的软件组件,以让用户使用非常有限的几个键盘键输入成千上万个不同的字符。JTextComponent 是该框架的一个活动客户端,因此它可实现与输入法交互的首选用户界面。因此,有些键事件因为受输入法处理而无法到达文本组件,而有些文本输入不是作为键事件而是作为在 InputMethodEvent 内的提交文本到达文本组件的。完整的文本输入是 keyTyped 键事件中的字符和输入法事件中的提交文本的结合。 AWT 侦听器模型让应用程序将事件侦听器附加到组件,以便将事件绑定到操作。Swing 鼓励使用 keymap 替代侦听器,但要通过使用它为侦听器提供获得事件的机会来维护与侦听器的兼容性。 键盘事件和输入法事件通过以下几个阶段进行处理,每个阶段都能使用该事件: Stage
KeyEvent
InputMethodEvent
1. 输入法 (在此处生成)
2. 焦点管理器
3. 注册的键侦听器 注册的输入法侦听器
4. 在 JTextComponent 中的输入法处理
5. 使用当前 keymap 进行 keymap 处理
6. 在 JComponent 中进行键盘处理(如加速键、组件导航等)
要维护与侦听键事件但不知道输入法事件的应用程序的兼容性,在阶段 4 中的输入法处理会提供不处理输入法事件的组件的兼容性模式。对于这些组件,可将提交文本转换为 keyTyped 键事件,并在阶段 3 开始的键事件管线中进行处理,而不是在输入法事件管线中处理。 默认情况下,组件将创建一个作为默认 keymap 由所有 JTextComponent 实例共享的 keymap(名为 DEFAULT_KEYMAP)。通常,外观实现将安装一个不同的 keymap,以便把另一个 keymap 中找不到的绑定解析为默认 keymap。该绑定最少包括: 将内容插入打印键编辑器。
使用 backspace 和 del 键移除内容。
前后移动的插入符 模型/视图拆分
文本组件具有模型/视图拆分功能。文本组件会将用于表示模型、视图和控制器的对象拉在一起。文本文档模型可以由充当该模型观察者的其他视图共享(如,多个组件可以共享一个文档)。
该模型由 Document 接口定义。此模型应提供灵活的文本存储机制,以在编辑过程中跟踪更改,并且可以扩展为更复杂的模型。该模型接口旨在捕获 SGML(用于表示多种内容的系统)提供的表达式功能。每次修改文档都会以 DocumentEvent 形式将更改的详细信息通知给所有观察者,允许视图与模型保持最新。将此事件发送给实现了 DocumentListener 接口且注册为对正在接受观察的模型感兴趣的观察者。
位置信息
提供确定视图中文本位置的功能。确定此信息有两个方法,modelToView(int) 和 viewToModel(java.awt.Point)。 撤消/重复支持
提供对编辑历史机制的支持,以允许进行撤消/重复操作。默认情况下文本组件本身不提供历史缓冲区,但确实提供可以与提供撤消/重复支持的历史缓冲区的 UndoableEdit 记录。该支持由 Document 模型提供,该模型允许用户附加 UndoableEditListener 实现。 线程安全
swing 文本组件对线程安全操作提供一定程度的支持。因为文本组件的可配置性级别高,所以可以超过所提供的保护。该保护主要来自模型,因此 AbstractDocument 的文档会描述提供的假定保护。异步调用的安全方法标记为注释。 换行
有关如果处理换行的讨论,请参阅 DefaultEditorKit。
警告:此类的已序列化对象与以后的 Swing 版本不兼容。当前序列化支持适用于短期存储或运行相同 Swing 版本的应用程序之间的 RMI。从 1.4 版本开始,已在 java.beans 包中添加了支持所有 JavaBeansTM 长期存储的功能。请参见 XMLEncoder。
你在记事本重用的JTextArea组件实现了相应的接口的方法cut,paste,copy等等方法,实现了相应接口,所以你的操作系统的对文本操作的快捷键,对其有效,不是你自己想的那样,对于文本组件,如果处于可编辑状态,DELETE,CTRL+C,CTRL+V的操作都是默认支持的(是java对系统的兼容性的表现)
这里我写了一个记事本程序,供你参考
*/
import javax.swing.*;
import java.awt.event.*;
import java.io.*;public class NotePad { private JFrame frame;
private JTextArea textArea;
private JScrollPane scrollPane; private JMenuBar menuBar;
private JMenu mnuFile, mnuEdit, mnuHelp;
private JMenuItem mnuItemNew, mnuItemExit, mnuItemAbout, mnuItemSave,
mnuItemCopy, mnuItemPaste, mnuItemCut, mnuItemOpen; private JFileChooser fileChooser1;
private JFileChooser fileChooser2; public NotePad() {
frame = new JFrame("记事本");
frame.setSize(400, 400); textArea = new JTextArea("", 20, 40);
scrollPane = new JScrollPane(textArea);
menuBar = new JMenuBar(); final MyAction action = new MyAction();
mnuFile = new JMenu("文件");
mnuEdit = new JMenu("编辑");
mnuHelp = new JMenu("帮助"); mnuItemNew = new JMenuItem("新建");
mnuItemExit = new JMenuItem("退出");
mnuItemSave = new JMenuItem("保存");
mnuItemOpen = new JMenuItem("打开"); mnuItemCopy = new JMenuItem("复制");
mnuItemPaste = new JMenuItem("粘贴");
mnuItemCut = new JMenuItem("剪切"); mnuItemAbout = new JMenuItem("关于"); mnuItemNew.addActionListener(action);
mnuItemExit.addActionListener(action);
mnuItemAbout.addActionListener(action);
mnuItemSave.addActionListener(action);
mnuItemCopy.addActionListener(action);
mnuItemPaste.addActionListener(action);
mnuItemCut.addActionListener(action);
mnuItemOpen.addActionListener(action); mnuFile.add(mnuItemNew);
mnuFile.add(mnuItemExit);
mnuFile.add(mnuItemSave);
mnuFile.add(mnuItemOpen); mnuEdit.add(mnuItemCopy);
mnuEdit.add(mnuItemPaste);
mnuEdit.add(mnuItemCut); mnuHelp.add(mnuItemAbout); menuBar.add(mnuFile);
menuBar.add(mnuEdit);
menuBar.add(mnuHelp); frame.setJMenuBar(menuBar);
frame.getContentPane().add(scrollPane); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); } private void openFile() throws IOException { String filepath = fileChooser1.getSelectedFile().getAbsolutePath();
FileReader fr = new FileReader(filepath);
BufferedReader br = new BufferedReader(fr);
String str;
while ((str = br.readLine()) != null)
textArea.setText(textArea.getText() + str + "\n");
br.close();
fr.close(); } private void saveFile() throws IOException { String filepath2 = fileChooser2.getSelectedFile().getAbsolutePath(); FileWriter fw = new FileWriter(filepath2);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw); pw.print(textArea.getText()); bw.close();
fw.close(); } private class MyAction implements ActionListener { public void actionPerformed(ActionEvent e) { final String command = e.getActionCommand(); if ("新建".equals(command)) {
textArea.setText("");
}
if ("退出".equals(command)) {
System.exit(0);
}
if ("保存".equals(command)) { fileChooser2 = new JFileChooser(); fileChooser2.showSaveDialog(frame); try {
saveFile();
} catch (IOException eee) {
}
}
if ("打开".equals(command)) {
fileChooser1 = new JFileChooser();
fileChooser1.showOpenDialog(frame);
try {
openFile();
} catch (IOException ee) {
}
}
if ("复制".equals(command)) {
textArea.copy();
}
if ("粘贴".equals(command)) {
textArea.paste();
}
if ("剪切".equals(command)) {
textArea.cut();
} if ("关于".equals(command)) {
JOptionPane.showMessageDialog(frame, "杜伟制作");
} } } public static void main(String[] args) {
new NotePad();
}
}
import java.awt.event.*;
import java.io.*;public class NotePad { private JFrame frame;
private JTextArea textArea;
private JScrollPane scrollPane; private JMenuBar menuBar;
private JMenu mnuFile, mnuEdit, mnuHelp;
private JMenuItem mnuItemNew, mnuItemExit, mnuItemAbout, mnuItemSave,
mnuItemCopy, mnuItemPaste, mnuItemCut, mnuItemOpen; private JFileChooser fileChooser1;
private JFileChooser fileChooser2; public NotePad() {
frame = new JFrame("记事本");
frame.setSize(400, 400); textArea = new JTextArea("", 20, 40);
scrollPane = new JScrollPane(textArea);
menuBar = new JMenuBar(); final MyAction action = new MyAction();
mnuFile = new JMenu("文件");
mnuEdit = new JMenu("编辑");
mnuHelp = new JMenu("帮助"); mnuItemNew = new JMenuItem("新建");
mnuItemExit = new JMenuItem("退出");
mnuItemSave = new JMenuItem("保存");
mnuItemOpen = new JMenuItem("打开"); mnuItemCopy = new JMenuItem("复制");
mnuItemPaste = new JMenuItem("粘贴");
mnuItemCut = new JMenuItem("剪切"); mnuItemAbout = new JMenuItem("关于"); mnuItemNew.addActionListener(action);
mnuItemExit.addActionListener(action);
mnuItemAbout.addActionListener(action);
mnuItemSave.addActionListener(action);
mnuItemCopy.addActionListener(action);
mnuItemPaste.addActionListener(action);
mnuItemCut.addActionListener(action);
mnuItemOpen.addActionListener(action); mnuFile.add(mnuItemNew);
mnuFile.add(mnuItemExit);
mnuFile.add(mnuItemSave);
mnuFile.add(mnuItemOpen); mnuEdit.add(mnuItemCopy);
mnuEdit.add(mnuItemPaste);
mnuEdit.add(mnuItemCut); mnuHelp.add(mnuItemAbout); menuBar.add(mnuFile);
menuBar.add(mnuEdit);
menuBar.add(mnuHelp); frame.setJMenuBar(menuBar);
frame.getContentPane().add(scrollPane); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); } private void openFile() throws IOException { String filepath = fileChooser1.getSelectedFile().getAbsolutePath();
FileReader fr = new FileReader(filepath);
BufferedReader br = new BufferedReader(fr);
String str;
while ((str = br.readLine()) != null)
textArea.setText(textArea.getText() + str + "\n");
br.close();
fr.close(); } private void saveFile() throws IOException { String filepath2 = fileChooser2.getSelectedFile().getAbsolutePath(); FileWriter fw = new FileWriter(filepath2);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw); pw.print(textArea.getText()); bw.close();
fw.close(); } private class MyAction implements ActionListener { public void actionPerformed(ActionEvent e) { final String command = e.getActionCommand(); if ("新建".equals(command)) {
textArea.setText("");
}
if ("退出".equals(command)) {
System.exit(0);
}
if ("保存".equals(command)) { fileChooser2 = new JFileChooser(); fileChooser2.showSaveDialog(frame); try {
saveFile();
} catch (IOException eee) {
}
}
if ("打开".equals(command)) {
fileChooser1 = new JFileChooser();
fileChooser1.showOpenDialog(frame);
try {
openFile();
} catch (IOException ee) {
}
}
if ("复制".equals(command)) {
textArea.copy();
}
if ("粘贴".equals(command)) {
textArea.paste();
}
if ("剪切".equals(command)) {
textArea.cut();
} if ("关于".equals(command)) {
JOptionPane.showMessageDialog(frame, "记事本");
} } } public static void main(String[] args) {
new NotePad();
}
}