大纲:
1. 使用线程实现字体不同颜色间的变换的小程序。
2. 简单的记事本小程序。
1. 使用线程实现字体不同颜色间的变换的小程序。
// Ex6_2_TextChangeJFrame.java
/**
* 题目要求:
* 编写一个Applet的小程序,利用线程绘制一串颜色闪烁、字体大小不断变化的字符串,
* 源程序保存为Ex6_2.java。
**/
/**
* 题目分析:
* 1. 首先设定好整体的窗口布局,将画板需要画的字符串使用一个继承Canvas类来实现。
* 2. 线程的实现方法就直接用主类继承Runnable接口。
* 3. 颜色大小的字体设定主要在继承Canvas类中实现,
* 4. 线程负责重绘刚刚看设定的继承Canvas,然后变化的时间间隔就通过线程的休眠时间来设定。
**/
import javax.swing.*;
import java.awt.*;
import java.awt.Color;
public class Ex6_2_TextChangeJFrame extends JFrame implements Runnable
{
MyCanvasl c1;
Thread firstThread;
Ex6_2_TextChangeJFrame(){
super("多线程实现字体不同颜色间变换"); // 继承父类构造方法
setBounds(200, 200, 800, 300); // 位置设定
setVisible(true); // 窗口设为可见
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭窗口
Container c = getContentPane();
c1 = new MyCanvasl(); // 申请内嵌类的变量
c1.setBackground(Color.white);
c.add(c1, BorderLayout.CENTER);
firstThread = new Thread(this); // 创建线程
firstThread.start();
}
public void run(){ // 实现接口
Thread nowThread = Thread.currentThread();
while(true){
c1.repaint(); // 重绘,刷新画板
try{
firstThread.sleep(1000);
}
catch(InterruptedException e){
}
}
}
class MyCanvasl extends Canvas{
int red, green, blue;
int fontPoint;
char c[] = {'超', '级', '无', '敌', '大', '小', '颜', '色', '变', '换', '字', '符', '串'};
public void paint(Graphics g){
fontPoint = (int) (Math.random() * 50);
g.setFont(new Font("宋体", 0, fontPoint)); // 设定字体
for(int i = 0; i < 13; ++i){
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
g.setColor(new Color(red, green, blue)); // 设定颜色
g.drawChars(c, i, 1, 20+i*fontPoint+i*fontPoint, 80); // 显示字体
}
}
}
public static void main(String [] args)
{
Ex6_2_TextChangeJFrame f = new Ex6_2_TextChangeJFrame();
}
}
2. 简单的记事本小程序。
// Nodepad.java -- 简单记事本程序的实现
/**
* 题目要求:
* 实现“简单记事本”窗口,源程序保存为Nodepad.java。
* 1)创建一个名为“简单记事本”窗口,在窗口中添加一个带有滚动条的文本区。
* 2)在窗口中添加一个具有以下菜单的菜单栏:
*? “文件”菜单,包含“打开”、“保存”、“退出”的菜单项,菜单间加分隔线,添加事件处理方法,使菜单具有打开、保存文件及退出的功能。
* “编辑”菜单,包含“复制”、“剪切”、“粘贴”的菜单项,添加事件处理方法,使菜单具有“复制”、“剪切”、“粘贴”的功能。
* “格式”菜单,包含“格式设置”的二级子菜单;而二级“格式设置”子菜单,包含 “自动换行”、“取消自动换行”、“断行不断字”、“取消断行不断字”的菜单项,添加事件处理方法,设置文本框自动换行和断行不断字的格式。
* 3)在窗口中添加工具栏,包含“打开”、“保存”、“复制”、“剪切”、“粘贴”图片按钮的工具栏,添加事件处理方法,单击相应的按钮能实现相应的功能。(图片可到ftp中文件夹:实验六/img中下载)
* 4)在窗口中添加弹出式菜单,包含“打开”、“保存”、“复制”、“剪切”、“粘贴”的菜单项,直接添加分隔线,添并加事件处理方法,选择相应的菜单项能实现相应的功能。
**/
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.*;
public class Nodepad extends JFrame implements ActionListener, MouseListener
{
JMenuBar mb = new JMenuBar(); // 创建菜单栏
JMenu m1 = new JMenu("文件"); // 创建菜单
JMenuItem open = new JMenuItem("打开"); // 创建菜单项
JMenuItem close = new JMenuItem("保存");
JMenuItem exit = new JMenuItem("退出");
JMenu m2 = new JMenu("编辑");
JMenuItem copy = new JMenuItem("复制");
JMenuItem cut = new JMenuItem("剪切");
JMenuItem paste = new JMenuItem("粘贴");
JMenu m3 = new JMenu("格式");
JMenu m3_2 = new JMenu("格式设置");
JMenuItem LineWrapTrue = new JMenuItem("自动换行");
JMenuItem LineWrapFalse = new JMenuItem("取消自动换行");
JMenuItem WrapStylewordTrue = new JMenuItem("断行不断字");
JMenuItem WrapStylewordFalse = new JMenuItem("取消断行不断字");
Container c; // 记事本编辑面板设置
JTextArea editor = new JTextArea();
Font t = new Font("sanserif", Font.PLAIN, 12);
JPopupMenu pm = new JPopupMenu(); // 创建弹出菜单对象
JMenuItem item1 = new JMenuItem("复制");
JMenuItem item2 = new JMenuItem("剪切");
JMenuItem item3 = new JMenuItem("粘贴");
JMenuItem item5 = new JMenuItem("打开");
JMenuItem item6 = new JMenuItem("保存");
JToolBar toolBar; // 工具栏
JButton bOpen = new JButton(new ImageIcon("open.png"));
JButton bSave = new JButton(new ImageIcon("save.png"));
JButton bCopy = new JButton(new ImageIcon("copy.png"));
JButton bCut = new JButton(new ImageIcon("cut.png"));
JButton bPaste = new JButton(new ImageIcon("paste.png"));
Nodepad(){
super("简单记事本");
this.setSize(800, 600);
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e){
System.err.println("不能设置外观的原因:" + e);
}
addFileMenu();
addEditMenu();
addFormatMenu();
addJMenuBar();
setJToolbar(); // 工具栏的设置
setPopupMenu(); // 设置弹出菜单
addEachActionListener(); // 注册监听事件
setJMenuBar(mb); // 显示菜单栏
c = getContentPane(); // 为JFrame布局
c.setLayout(new BorderLayout());
c.add("Center", new JScrollPane(editor));
c.add("North", toolBar);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void addFileMenu(){ // 创建“文件”菜单的方法
m1.add(open);
m1.add(close);
m1.addSeparator(); // 将分隔条加入到菜单中
m1.add(exit);
m1.setFont(t); // 设置菜单字体
}
private void addEditMenu(){ // 创建“编辑”菜单的方法
m2.add(copy);
m2.add(cut);
m2.addSeparator();
m2.add(paste);
m2.setFont(t);
}
private void addFormatMenu(){ // 创建“格式”菜单的方法
m3.add(m3_2);
m3_2.add(LineWrapTrue);
m3_2.add(LineWrapFalse);
m3_2.addSeparator();
m3_2.add(WrapStylewordTrue);
m3_2.add(WrapStylewordFalse);
m3_2.setFont(t);
}
private void addJMenuBar(){ // 将菜单加入到菜单棒的方法
mb.add(m1);
mb.add(m2);
mb.add(m3);
}
private void setJToolbar(){ // 工具栏的设置
toolBar = new JToolBar(); // 工具栏
toolBar.add(bOpen);
toolBar.add(bSave);
toolBar.addSeparator();
toolBar.add(bCopy);
toolBar.add(bCut);
toolBar.add(bPaste);
}
private void setPopupMenu(){ // 初始化弹出菜单对象
editor.add(pm); // 将弹出菜单加入到文本区中
pm.add(item5);
pm.add(item6);
pm.addSeparator();
pm.add(item1);
pm.add(item2);
pm.add(item3);
}
private void addEachActionListener(){ // 注册菜单项的鼠标事件监听器
open.addActionListener(this); // 文件菜单
close.addActionListener(this);
exit.addActionListener(this);
copy.addActionListener(this); // 编辑菜单
cut.addActionListener(this);
paste.addActionListener(this);
LineWrapTrue.addActionListener(this); // 格式菜单
LineWrapFalse.addActionListener(this);
WrapStylewordTrue.addActionListener(this);
WrapStylewordFalse.addActionListener(this);
bOpen.addActionListener(this); // 工具栏
bSave.addActionListener(this);
bCopy.addActionListener(this);
bCut.addActionListener(this);
bPaste.addActionListener(this);
item1.addActionListener(this); // 弹出式菜单
item2.addActionListener(this);
item3.addActionListener(this);
item5.addActionListener(this);
item6.addActionListener(this);
editor.addMouseListener(this); // 注册文本区的鼠标事件监听器
}
private void loadFile(){ // 打开文件
JFileChooser fc = new JFileChooser();
int r = fc.showOpenDialog(this);
if(r == JFileChooser.APPROVE_OPTION){
File file = fc.getSelectedFile();
try{
editor.read(new FileReader(file), null);
}
catch(IOException e){
}
}
}
private void saveFile(){ // 保存文件
JFileChooser fc = new JFileChooser();
int r = fc.showSaveDialog(this);
if(r == JFileChooser.APPROVE_OPTION){
File file = fc.getSelectedFile();
try{
editor.write(new FileWriter(file));
}
catch(IOException e){
}
}
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == item5 || e.getSource() == open || e.getSource() == bOpen){
loadFile();
}
else if(e.getSource() == item6 || e.getSource() == close || e.getSource() == bSave){
saveFile();
}
else if(e.getSource() == exit){
System.exit(0);
}
else if(e.getSource() == item1 || e.getSource() == copy || e.getSource() == bCopy){
editor.copy();
}
else if(e.getSource() == item2 || e.getSource() == cut || e.getSource() == bCut){
editor.cut();
}
else if(e.getSource() == item3 || e.getSource() == paste || e.getSource() == bPaste){
editor.paste();
}
else if(e.getSource() == LineWrapTrue){
editor.setLineWrap(true);
}
else if(e.getSource() == LineWrapFalse){
editor.setLineWrap(false);
}
else if(e.getSource() == WrapStylewordTrue){
editor.setWrapStyleWord(true);
}
else if(e.getSource() == WrapStylewordFalse){
editor.setWrapStyleWord(false);
}
}
public void mouseReleased(MouseEvent e){
if (e.isPopupTrigger()){
pm.show(editor, e.getX(), e.getY()); // 显示弹出式菜单
}
}
public void mouseClicked(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mousePressed(MouseEvent e){
}
public static void main(String args[]){
Nodepad test = new Nodepad();
}
}