《疯狂Java讲义》读书笔记(七):Swing编程

第十二章 Swing编程

 1Swing开发图形界面比AWT更加优秀,它是一种轻量级组件,采用100%Java实现,不依赖于本地平台的图形界面,对跨平台支持比较出色。依赖于本地平台的AWT组件被称为重量级组件。通常在AWT组件的组件名前添加“J”就变成了对应的Swing组件。

Swing中包含了4个组件直接集成了AWT组件,而不是从JComponent派生的,它们分别是:JFrameJWindowJDialogJApplet。它们是重量级组件,需要部分委托给运行平台上的GUI组件的对等体。Swing除了Canvas之外的所有AWT组件都提供了相应的实现。

①使用setToolTipText()为组件设置对用户有帮组的提示信息;②ImageIcon该实现类代表一个图像图标;③支持拔插式的外观风格,每个JComponent对象都有一个对应的ComponentUI对象,完成所有的绘画、事件处理、决定尺寸大小等工作。每个Swing组件都有一个对应的UI类,例如JButton组件就有一个对应的ButtonUI类来作为UI代理。一般是将Swing组件类名去掉J,后面添加UI后缀。

frame.setLocationRelativeTo(null);//默认窗口居中位置

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口,点击右上角的 X 即可关闭窗口。

Swing菜单不允许使用add(new JMenuItem("-"))的方式来添加菜单分隔符,只能使用addSeparator()方法来添加菜单分隔符。

Swing组件添加右键菜单无须像AWT那样繁琐,只需要调用setComponentPopupMenu()方法来设置右键菜单即可。简而言之,如果希望让JTextAreaJTable组件有滚动效果支持,只要将该组件放入JScrollPane中,再将该JScrollPane容器添加到窗口中即可。

JScrollPane对于JTable组件尤其重要,通常需要把JTable放在JScrollPane容器中才可以显示出JTable组件的标题栏。

Swing组件的双缓冲和键盘驱动:所有的Swing组件默认还有如下两个功能:默认的双缓冲绘图技术和简单的键盘驱动。JComponent组件默认启用双缓冲,无须自己实现,如果想关闭,可以在组件上调用setDoubleBuffered(false)方法。JComponent类提供了getInputMapgetActionMap两个方法,getInputMap返回一个关联,该对象用于将KeyStroke对象(代表键盘或其他类似输入设备的一次输入事件)和名字关联;getActionMap返回一个ActionMap对象,该对象用于将指定名字和ActionAction接口是ActionListener的子接口,可以作为一个事件监听器使用)关联,从而允许用户通过键盘操作来代替鼠标驱动GUI上的Swing组件,即快捷键。典型用法例子:

// 添加事件监听器

button.addActionListener(senMessage);

// 将Ctrl+Enter作为键和 send关联

textField.getInputMap().put(KeyStroke.getKeyStroke('\n',java.awt.event.InputEvent.CTRL_MASK), "send");

//将send和senMessage Action关联

textField.getActionMap().put("send", senMessage);

//监听事件实现

Action senMessage = new AbstractAction() {

public void actionPerformed(ActionEvent e) {Date date = new Date();

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

String sendTime = simpleDateFormat.format(date);textArea.append(textField.getText() + "  " + sendTime + "\n");

textField.setText("");}};

☞使用JToolBar创建工具条:创建JToolBar对象时可以指定如下两个参数:name指定工具条的名称和orientation指定工具条的方向。一旦创建了JToolBar对象之后,JToolBar对象还有如下几个常用方法:

JButton add(Action a)通过Action对象为JToolBar添加对应的工具按钮;void addSeparator(Dimension size):向工具条中添加指定大小的分隔符,可以使用默认大小的分隔符;void setFloatable(boolean b):设置该工具条是否可以浮动,即该工具条是否可以拖动;void setMargin(Insets m)设置工具条边框和工具按钮之间的页边距;void setOrientation(int o)设置工具条的方向。

Clipboard clipboard=Toolkit.getDefaultToolkit().getSystemClipboard();//获取系统剪贴板

Action pasteAction=new AbstractAction("粘贴",new ImageIcon("ico/paste.png")){

public void actionPerformed(ActionEvent e){

if(clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor))//如果剪贴板中包含stringFlavor内容

{try{

//取出剪贴板中的stringFlavor内容  

String content=(String)clipboard.getData(DataFlavor.stringFlavor);

//将选中内容替换成剪贴板内容  

jta.replaceRange(content,jta.getSelectionStart(),jta.getSelectionEnd());}catch()

}}}

//复制的主要代码

StringSelection contents=new StringSelection(jta.getSelectedText());//将StringSelection对象放入剪贴板中

clipboard.setContents(contents,null);   //如果剪贴板中包含stringFlavor内容,则激活“粘贴”按钮事件

if(clipboard.isDateFlavorAvailable(DataFlavor.stringFlavor)){

pasteAction.setEnabled(true);}

 

☞JFileChooser的功能与AWT中的FileDialog基本相似,与FileDialog不同的是,JFileChooser无需依赖本地平台的GUI,由100%纯Java实现。JFileChooser先创建一个对话框实例,有多个构造器,包含两个参数currentDirectory、FileSystemView。JFileChooser并不是JDialog的子类,所以不能使用setVisible(true)方法来显示该文件对话框,而是使用showXXXDialog()方法来显示文件对话框。创建JFileChooser对象时可以指定初始化路径,如下代码:

JFileChooser chooser=new JFileChooser(".");表示以当前路径创建文件选择器。

☞JFileChooser大致有如下几个常用方法:

setSelectedFile/setSelectedFiles指定该文件选择器默认选择的文件(也可以默认选择多个文件):chooser.setSelectedFile(new File("123.jpg"));    

setMultiSelectionEnabled(boolean b)默认情况下,该文件选择器只能选择一个文件,通过该方法可以设置允许选择多个文件(设置b为true即可)。   

setFileSelectionMode(int mode)在默认情况下,该文件选择器只能选择一个文件,该方法可以设置允许选择文件、路径、文件与路径,设置参数值为:JFileChooser.FILES_ONLY、JFileChooser.DIRECTORIES_ONLY、JFileChooser.FILES_AND_DIRECTORIES。

☞如果让文件对话框实现文件过滤功能,则需要结合FileFilter类来实现文件过滤。JFileChooser提供了两个方法来安装文件过滤器:addChoosableFileFilter(FileFilter filter)添加文件过滤器,该方法允许该文件对话框有多个文件过滤器。

setFileFilter(FileFilter filter):设置文件过滤器,一旦调用该方法,将导致文件对话框只有一个文件过滤器。

☞FileView类可以改变文件对话框的外观视图。

☞调用showXXXDialog()方法可以打开文件对话框,通常有三个方法可以用:

int showDialog(Component parent,String approveButtonText)弹出文件对话框,该对话框的标题、“同意”按钮的文本(默认是 保存 或 取消 按钮)由approveButtonText指定。 

int showOpenDialog(Component parent)弹出文件对话框,有默认标题,“同意”按钮的文本是“打开”。  

int showSaveDialog(Component parent)弹出文件对话框,该对话框具有默认标题,“同意”按钮的文本是“保存”。

☞JFileChooser提供了两个方法来获取用户选择的文件或文件集:File getSelectedFile()返回用户选择的文件。File[] getSelectedFiles()返回多个文件。

默认情况下,JFileChooser总会在文件对话框的“文件类型”下拉列表中增加“所有文件”选项,但可以调用JFileChooser的setAcceptAllFileFilterUsed(flase)来取消显示该选项。

 

☞使用JOptionPane可以非常方便的创建一些简单的对话框,有4个方法:

①showMessageDialog/showInternalMessageDialog:消息对话框,告知用户某事已经发生,用户只能点击“确定”按钮,类似JavaScript的alert函数。

②showConfirmDialog/showInternalConfirmDialog:确认对话框,用户可以选择yes、no、cancel选项。该方法返回用户单击了哪个按钮;

③showInputDialog/showInternalInputDialog:输入对话框,该方法返回用户输入的字符串;④showOptionDialog/showInternalInputDialog:自定义选项对话框,允许使用自定义选项,可以取代showConfirmDialog所产生的对话框,只是用起来复杂。JOptionPane产生的所有对话框都是模式的,在用户完成对话框的交互之前,showXXXDialog方法都将一直阻塞当前线程。

1)输入区:输入区组件可以是普通文本框组件,也可以是下拉列表框组件;

2)图标区:左上角的图标会随创建的对话框所包含消息类型的不同而不同,JOptionPane提供5种消息类型:

☞ERROR_MESSAGE:错误消息,其图标是一个红X;☞INFORMATION_MESSAGE:普通消息,蓝色的感叹号;☞WARNING_MESSAGE:警告消息,黄色感叹号;☞QUESTION_MESSAGE:问题消息,绿色问号;☞PLAIN_MESSAGE:普通消息,没有默认图标。

3)消息区:不管哪种对话框,其消息区总是存在的,消息区的内容通过message参数来指定,该message参数可以是以下几种:

①String类型:系统将该字符串对象包装成JLabel对象,然后显示在对话框中;②Icon:该Icon被包装成JLabel后作为对话框的消息;③Component:将该Component在对话框的消息区中显示出来;④Object[] :对象数组被解释为在纵向排列的一系列message对象,每个message对象根据其实际类型又可以是字符串、图标、组件、对象数组等。⑤其它类型:系统调用该对象的toString方法返回字符串。

4)按钮区:对话框底部的按钮区也是一定存在的,底部总是包含“确定”和“取消”两个标准按钮,该参数可以取如下几个值:①DEFAULT_OPTION:按钮只包含一个“确定”按钮;②YES_NO_OPTION:按钮包含“是”、“否”两个按钮;③YES_NO_CANCEL_OPTION:按钮包含“是”、“否”、“取消”三个按钮;④OK_CANCEL_OPTION:按钮包含“确定”、“取消”2个按钮。

int str1 = JOptionPane.showConfirmDialog(frame, "这是弹出来的信息"); System.out.println(str1);

是:返回0。否:返回1。取消:返回2。右上角红X:返回-1

String[] aa = { "深圳", "广州", "北京", "上海" };    

Object str = JOptionPane.showInputDialog(frame, "想去哪里发展?","弹框的标题"

JOptionPane.WARNING_MESSAGE, null, aa, aa[0]);  

System.out.println(str.toString());

其中JOptionPane.WARNING_MESSAGE可以使用数字1,2,3等表示,但是数字表示不直观,不利于代码阅读。倒数第一个参数表示选中的默认值。

 

Swing简化的拖放功能:

textArea.setDragEnabled(true);//启动文本域和单行文本框的拖放支持

frame.add(new JScrollPane(textArea));//滚动条,简洁的代码编写风格

 

使用JProgressBarProgressMonitorBoundedRangeModel创建进度条:

使用JProgressBar可以非常方便的创建进度条,步骤有仨:①创建JProgressBar对象,可以指定3个参数,用于设置进度条的排列方向(竖直和水平)、进度条的最大值和最小值。②调用该对象的常用方法设置进度条的普通属性,JProgressBar除了提供设置排列方向、最小最大值的settergetter方法之外,还提供了3个方法:setBorderPainted(boolean b)设置该进度条是否使用边框;setIndeterminate(boolean newValue),设置该进度条是否是进度不确定的进度条,如果指定一个进度条的进度不确定,将看到一个滑块在进度条中左右移动;setStringPainted(boolean newValue):设置是否在进度条中显示完成的百分比。③当程序中工作进度改变时,调用JProgressBar对象的setValue方法,当进度条的完成进度发生改变时,程序还可以调用进度条对象的如下2个方法:double getPercentComplete返回进度条的百分比,String getString()返回进度条字符串的当前值。

使用匿名内部类来使用Timer,创建进度条:

import java.awt.FlowLayout;

import java.util.Timer;

import java.util.TimerTask;

import javax.swing.JFrame;

import javax.swing.JProgressBar;

public class TestProgressBar {

JFrame jframe = new JFrame("测试");

JProgressBar bar = new JProgressBar(JProgressBar.HORIZONTAL);//水平的

public void init() {

jframe.setLayout(new FlowLayout());

jframe.add(bar);bar.setStringPainted(true);// 绘制百分比

final SimulateClass target = new SimulateClass(100);

new Thread(target).start();

// 启动一条线程的方式来执行一个耗时任务

bar.setMinimum(0);

bar.setMaximum(target.getAmount());

Timer timer=new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

bar.setValue(target.getCurrent());

System.out.println("完成了工作量的:"+target.getCurrent());}}, 

1000, 2000);

//实际上,Java实时性很差,如果调用TimerscheduleAtFixedRate方法,那么Timer会尽量让Task执行频率保持在2秒一次,如果某一次延迟,Timer会记录下这个延迟,并尝试在下一个任务时弥补这个延迟。

jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jframe.pack();

jframe.setVisible(true);}

public static void main(String[] args) {new TestProgressBar().init();}}

class SimulateClass implements Runnable {

private volatile int current;

private int amount;

public int getCurrent() {

return current;}

public int getAmount() {return amount;}

public SimulateClass(int amount) {current = 0;this.amount = amount;}

@Override

public void run() {

while(current<amount){

try {

Thread.sleep(150);} 

catch (Exception e) {

e.printStackTrace();}

current++;}}}

 

注:自定义的class SimulateClass implements Runnable实现了Runnable接口,这是一个特殊的接口,实现该接口可以实现多线程功能。

 

创建进度对话框:

ProgressMonitor的用法与ProgressBar的用法基本相似,只是ProgressMonitor可以直接创建一个进度对话框,构造器如下:ProgressMonitorComponent parentComObject messageString noteint minint max):该构造器中的parentCom参数用于设置该进度对话框的父组件,message用于设置该进度条对话框的描述信息,note用于设置该进度条的提示文本,minmax用于设置对话框所包含进度条的最小值和最大值。

final ProgressMonitor dialog=new ProgressMonitor(null, "等待任务的完成...", "已完成:", 0, target.getAmount());

 

使用JTable和TableModel创建表格:

使用JTable创建表格非常容易,JTable可以把一个二维数据包装成一个表格,数据既可以是二维数组,也可也是集合元素为Vector的对象,为了给表格的每一列指定列标题,还需要传入一个一维数据作为列标题,一维数据既可以是一维数组,也可也是Vector对象。

JFrame frame = new JFrame("测试表格");JTable table;

Object[][] tableData = { new Object[] { "张三", 28, "男", "没有列名吗" },

new Object[] { "哈哈", 20, "女", "没有列名吗" },new Object[] { "么么哒", 22, "女", "没有列名吗" },

new Object[] { "lili", 28, "男", "没有列名吗" },new Object[] { "斯诺克", 30, "男", "没有列名吗" }, };

Object[] columnTitle = { "姓名", "年龄", "性别", "数据可以多,但是标题不能多" };

public void init() {

// 以二维数组和一维数组来创建一个JTable对象

table = new JTable(tableData, columnTitle);

// 将表放入JScrollPane中

frame.add(new JScrollPane(table));

frame.pack();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLocationRelativeTo(null);

frame.setVisible(true);}

 

注:表头只能少,不能多出一列,表头少的仅仅显示前面的数据,而后面的数据将不能正常显示。如果不把JTable放在JScrollPane中显示,JTable默认不会显示列标题。

 

使用JPasswordFieldJPasswordFieldJTextField的一个子类,当用户向JPasswordField输入内容时,JPasswordField会显示星号或者黑点来代替用户输入的字符串。除此之外,JPasswordField重写了JTextComponentgetText()方法,并且不再推荐使用getText()方法返回字符串密码框的字符串,因为getText()方法返回的字符串会一直停留在虚拟机中,直到垃圾回收,这可能导致一些安全隐患,所以JPasswordField提供了一个getPassword()方法,有更好的机制。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值