Java学习记录(三) Swing组件:的使用

本文深入探讨Swing——Java的第二代GUI工具集,并详细解析JTextArea组件的使用方法,包括构造函数、常用方法及如何实现撤销复原功能。

Swing

Swing 是第二代GUI开发工具集,javax.swing包被列入Java的基础类库(JFC),Swing建立在AWT,Java2D,Accessibility等的基础上。与AWT相比,Swing具有更好的可移植性,提供了更完整的组件,增加了许多功能。


JTextArea

JTextArea是一个实现多行文本的控件

构造函数

JTextArea() 构造新的TextArea。
JTextArea(Document doc) 构造新的 JTextArea,使其具有给定的文档模型,所有其他参数均默认为 (null, 0, 0)JTextArea(Document doc, String text, int rows, int columns) 构造具有指定行数和列数以及给定模型的新的 JTextArea。
JTextArea(int rows, int columns) 构造具有指定行数和列数的新的空 TextArea。
JTextArea(String text) 构造显示指定文本的新的 TextArea。
JTextArea(String text, int rows, int columns) 构造具有指定文本、行数和列数的新的 TextArea.

常用方法

append(String text) 在末尾插入文本
getColumns()
getLineWrap() 获取文本区的换行策略
setLineWrap(boolean wrap) 设置换行的策略,如果设置为true,那么就会在一行结束的时候自动换行
setWrapStyleWord(boolean wrap) 设置断行不断字,也就是在你写单词写到末尾的时候如果没有写完,那么就会将你这个单词一起移到下一行来,而不是只移动一个单词下来,这样就会单词不分割了
setFont(Font f) 设置字体
insert(String str, int pos) 将指定文本插入指定位置。
replaceRange(String str, int start, int end) 用给定的新文本替换从指示的起始位置到结尾位置的文本。
setRows(int rows) 设置此 TextArea 的行数。

由于JTextArea是一个二维的输入组件,因此 [Enter] 键在JTextArea中代表的意义只是单纯的换行字符而不再是一个事件驱动的切入点,需要使用 Listener的机制来处理发生在JTextArea中的事件。在JTextArea中使用的Listener有两种,一个是UndoableEditListener,另一个是DocumentListenerUndoableEditListener interface是负责纪录JTextArea中所有操作发生的顺序并且可以运行还原上一步的功能。这个功能在目前的软件中应用相当广泛,如Word中的撤销功能。DocumentListener interface则是纪录发生在JTextArea中所有的事件(如输入字符、删除字符、粘贴、剪切)并将所有的事件以树状的层次式结构组织起来;也就是说当JTextArea中的内容有任何变动时,会DocumentEvent,此时必须使用DocumentListener接口中的方法来处理此事件。


实现JTextArea 撤销复原功能

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.undo.*;
import javax.swing.event.*;

public class JTextAreaTest extends JFrame implements UndoableEditListener{

    private UndoableEdit edit;
    private JTextArea    jta;
    private JTextArea    message;
    private JMenuItem    undoitem;
    private JMenuItem    redoitem;
   
    public JTextAreaTest(){
    	
    	super("JTextAreaTest");
    	jta = new JTextArea();
    	jta.getDocument().addUndoableEditListener(this);//加入UndoableEditListener.

        message = new JTextArea();
        message.setEditable(false);//利用setEditable()方法将另一个JTextArea设置为不可编辑.

        JPanel p1 = new JPanel();
        p1.setLayout(new GridLayout(1,1));
        p1.setBorder(BorderFactory.createTitledBorder("Edit Area"));  
        p1.add(new JScrollPane(jta));
		//分别将两个JTextArea通过JPanel放到JFrame中。
        JPanel p2 = new JPanel();
        p2.setLayout(new GridLayout(1,1));
        p2.setBorder(BorderFactory.createTitledBorder("Message"));  
        p2.add(new JScrollPane(message));        
        
    	getContentPane().setLayout(new GridLayout(2,1));
    	getContentPane().add(p1);
    	getContentPane().add(p2);
 	
     	//建立目录菜单并放置到JFrame中.
    	JMenuBar bar  = new JMenuBar();
    	JMenu theMenu = new JMenu("Edit");
    	undoitem = new JMenuItem("Undo");
    	redoitem = new JMenuItem("Redo");
    	theMenu.add(undoitem);
    	theMenu.add(redoitem);
    	bar.add(theMenu);
    	updateMenuItem();//构造目录菜单
    	
    	setJMenuBar(bar);
    	setSize(300,300);
    	
    	undoitem.addActionListener(new ActionListener(){
    		public void actionPerformed(ActionEvent ev){
    			edit.undo();
    			updateMenuItem();//运行undo功能
    			message.append("- Undo -\n");
    		}	
    	});

    	redoitem.addActionListener(new ActionListener(){
    		public void actionPerformed(ActionEvent ev){
    			edit.redo();
    			updateMenuItem();//运行redo功能
    			message.append("- Redo -\n");
    		}	
    	});    	
    }

    public void undoableEditHappened(UndoableEditEvent ev){
    	StringBuffer buf = new StringBuffer(200);
         /*当TextArea中有所操作时,用getEdit()方法取得UndoableEdit对象
          *可由些对象的undo()或redo()达到取消或复原的功能.
          */
    	edit = ev.getEdit();
    	buf.append("undoableEdit:");
    	buf.append(edit.getPresentationName());
    	buf.append("\n");
    	message.append(buf.toString());
    	updateMenuItem();
    }
	//判断是否此时是否可以运行undo或redo的功能,并且改变目录菜单的状态值.
    public void updateMenuItem(){
    	
    	if (edit != null){
		  undoitem.setEnabled(edit.canUndo());
		  redoitem.setEnabled(edit.canRedo());
		  undoitem.setText(edit.getUndoPresentationName());
		  redoitem.setText(edit.getRedoPresentationName());
	    }else{
		  undoitem.setEnabled(false);
	  	  redoitem.setEnabled(false);
		  undoitem.setText("Undo");
		  redoitem.setText("Redo");
	}
    }

    public static void main(String args[])    {

    	JFrame f = new JTextAreaTest();
    	f.addWindowListener(new WindowAdapter() {            
    		public void windowClosing(WindowEvent e) {                    
    			System.exit(0);            
    		}        
    	});
    	f.show();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值