第4章+JComponent类.docx
- 文档编号:9174847
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:27
- 大小:22.62KB
第4章+JComponent类.docx
《第4章+JComponent类.docx》由会员分享,可在线阅读,更多相关《第4章+JComponent类.docx(27页珍藏版)》请在冰点文库上搜索。
第4章+JComponent类
第4章JComponent类
JComponent类是所有Swing轻量组件的基类,因此,我们单独用一章对它进行讨论。
JComponent对Swing的意义就如同java.awt.Component对AWT的意义一样,它们都是它们各自框架组件的基类。
作为所有Swing轻量组件的基类,JComponent提供了大量的基本功能。
要全面了解Swing,就必须知道JComponent类提供的功能,还必须知道如何使用JComponent类。
4.1JComponent类概览
JComponent扩展java.awt.Container,而java.awt.Container又扩展java.awt.Component,因此,所有的Swing组件都是AWT容器。
Component和Container类本身提供了大量的功能,因此,JComponent继承了大量的功能。
本章(实际上本书)假设读者有AWT组件和容器的基本知识,这些基本知识在《Java2图形设计,卷Ⅰ:
AWT》中用了大量的篇幅来介绍。
因为JComponent为几乎所有的Swing组件提供下层构件,因此,它是一个很大的类,包括100多个public方法。
JComponent为它的扩展提供了下面的功能:
■边框。
■自动滚动。
■可访问性。
■工具提示。
■双缓存。
■键击处理。
■调试图形。
■客户属性。
4.1.1边框
任何JComponent的扩展都可以带边框。
Swing提供了许多不同风格的边框,如雕刻边框、带标题边框和蚀刻边框。
虽然一个组件只能有一个边框,但是边框是可以组合的。
因此,从效果上来看,单个组件可有多个边框。
图4-1示出了组合边框、带标题边框和定制边框。
边框通常用来组织组件集,但在其他情况下也是很有用的。
例如,图4-1示出的组合框可以作为一显示艺术品略图的图形程序的图片帧。
通常,可操作的边框在绘图程序中用来移动和改变对象的大小,而且作为Swing的定制边框,这种边框实现起来也很容易。
本章不详细介绍边框,有关边框的知识,请参见第5章“边框、图标和动作”。
4.1.2可访问性
可访问性是使人人都能使用软件。
例如,为视力不好的用户放大字体或为听力不好的用户显示带声音的标题。
Swing的插入式界面模式体系结构通过允许把可选择的界面样式分配给一组组件来支持可访问性。
图4-2所示的SwingSet样例应用程序使用一个定制的界面样式,它具有高反差、大字体的外观,为视力不好的用户提供了更好的可读性。
除了Swing插入式界面模式外,使用一个可访问API和一组可访问工具也能支持可访问性。
在第4.11节“支持可访问性”中介绍了可访问性。
4.1.3双缓存
在更新组件(擦除然后重绘组件)时,会产生可察觉的闪烁。
双缓存通过在屏外缓存区中更新组件,然后把屏外缓存区的相应部分拷贝到组件的屏上代表中来消除闪烁。
所有的Swing轻量组件都继承了双缓存它们显示内容的能力。
一个屏外缓存(由Swing的RepaintManager维护)常用于双缓存JComponent的扩展。
图4-3示出了一个篮球图像的简单动画和含有可拖动的轻量组件的应用程序。
除了为双缓存轻量组件使用屏外缓存外,开发人员还可以为拖动轻量组件或实现动画等其他目的而使用屏外缓存。
4.1.4调试图形
4.1.5自动滚动
4.1.6工具提示
4.1.7键击处理和客户属性
4.2JComponent类结构
4.2.1Swing组件是AWT容器
例4-1作为容器使用的Swing按钮
importjavax.swing.*;
importjava.awt.*;
publicclassButtonAsContainerextendsJApplet{
publicvoidinit(){
JButtonb=newJButton("SwingButtonsAreContainers");
b.setLayout(newFlowLayout());
b.add(newButton("AWTButton"));
b.add(newJButton("SwingButton"));
getContentPane().add(b);
}
}
4.2.2最小尺寸、最大尺寸和首选尺寸
例4-2为JComponent显式地设置首选大小
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
publicclassTestextendsJApplet{
JComboBoxsizeCombo=newJComboBox(newObject[]{
"null",
"100x100"
});
JListlist=newJList(newObject[]{
"item1",
"item2",
"item3",
"item4",
"item5",
});
publicvoidinit(){
finalContainercontentPane=getContentPane();
list.setBorder(
BorderFactory.createLineBorder(Color.black));
sizeCombo.setSelectedIndex(0);
contentPane.setLayout(newFlowLayout());
contentPane.add(list);
contentPane.add(newJLabel("preferredsizeforlist:
"));
contentPane.add(sizeCombo);
sizeCombo.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
intindex=sizeCombo.getSelectedIndex();
if(index==0)
list.setPreferredSize(null);
else
list.setPreferredSize(
newDimension(100,100));
list.revalidate();
}
});
}
}
4.3绘制JComponent组件
4.3.1Swing组件中的定制绘制
4.3.2在AWT组件中重载绘制方法
例4-3为定制AWT组件而重载paint()
importjava.applet.Applet;
importjava.awt.*;
publicclassTestAppletextendsApplet{
publicvoidinit(){
ImageCanvasimageCanvas=newImageCanvas("sphere.gif");
//ImageCanvasimageCanvas=newImageCanvas(
add(imageCanvas);
//setVisible(true);
}
}
classImageCanvasextendsCanvas{
Imageimage;
publicImageCanvas(StringimageName){
image=Toolkit.getDefaultToolkit().getImage(imageName);
MediaTrackermt=newMediaTracker(this);
try{
mt.addImage(image,0);
mt.waitForID(0);
}
catch(InterruptedExceptionex){
ex.printStackTrace();
}
}
publicvoidpaint(Graphicsg){
g.drawImage(image,0,0,null);
}
publicDimensiongetPreferredSize(){
returnnewDimension(image.getWidth(null),
image.getHeight(null));
}
}
4.3.3在Swing组件中重载绘制方法
例4-4带有从JComponent派生的图像画布的小应用程序
importjavax.swing.*;
importjava.awt.*;
publicclassTestAppletextendsJApplet{
publicvoidinit(){
ContainercontentPane=getContentPane();
ImageCanvasimagePanel=newImageCanvas(
"sphere.gif",
"abluesphere");
imagePanel.setBorder(
BorderFactory.createTitledBorder("ImageCanvas"));
contentPane.setLayout(newFlowLayout());
contentPane.add(imagePanel);
}
}
例4-5为定制Swing组件而重载paintComponent()
classImageCanvasextendsJPanel{
ImageIconicon;
publicImageCanvas(StringimageName,Stringdescription){
//icon=newImageIcon(imageName,description);
icon=newImageIcon(this.getClass().getResource(imageName),description);
}
publicvoidpaintComponent(Graphicsg){
Insetsinsets=getInsets();
super.paintComponent(g);
icon.paintIcon(this,g,insets.left,insets.top);
}
publicDimensiongetPreferredSize(){
Insetsinsets=getInsets();
returnnewDimension(
icon.getIconWidth()+insets.left+insets.right,
icon.getIconHeight()+insets.top+insets.bottom);
}
}
4.3.4paint、repaint和update方法
4.3.5validate、invalidate和revalidate方法
4.3.6不透明组件与透明组件的比较
例4-6不透明测试小应用程序
publicclassOpaqueTestextendsJApplet{
publicvoidinit(){
ContainercontentPane=getContentPane();
RainPanelrainPanel=newRainPanel();
ColoredPanelopaque=newColoredPanel(),
transparent=newColoredPanel();
//JComponentsareopaquebydefault,sotheopaque
//propertyonlyneedstobesetfortransparent
transparent.setOpaque(false);
rainPanel.add(opaque);
rainPanel.add(transparent);
contentPane.add(rainPanel,BorderLayout.CENTER);
}
}
例4-7不容透明Swing组件
importjavax.swing.*;
importjava.awt.*;
publicclassOpaqueTestextendsJApplet{
publicvoidinit(){
ContainercontentPane=getContentPane();
RainPanelrainPanel=newRainPanel();
ColoredPanelopaque=newColoredPanel(),
transparent=newColoredPanel();
//JComponentsareopaquebydefault,sotheopaque
//propertyonlyneedstobesetfortransparent
transparent.setOpaque(false);
rainPanel.add(opaque);
rainPanel.add(transparent);
contentPane.add(rainPanel,BorderLayout.CENTER);
System.out.println(opaque.isOpaque());
System.out.println(transparent.isOpaque());
}
}
classRainPanelextendsJPanel{
ImageIconrain=newImageIcon(this.getClass().getResource("rain.gif"));
privateintrainw=rain.getIconWidth();
privateintrainh=rain.getIconHeight();
publicvoidpaintComponent(Graphicsg){
Dimensionsize=getSize();
for(introw=0;row for(intcol=0;col rain.paintIcon(this,g,col,row); } } classColoredPanelextendsJPanel{ publicvoidpaintComponent(Graphicsg){ super.paintComponent(g); Dimensionsize=getSize(); g.setColor(Color.black); g.drawRect(0,0,size.width-1,size.height-1); g.setColor(Color.red); g.fillRect(size.width/2-25,size.height/2-25,50,50); } publicDimensiongetPreferredSize(){ returnnewDimension(100,100); } } 4.3.7立即绘制Swing组件 例4-8在事件处理方法中使用paintImmediately() importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; publicclassTestAppletextendsJApplet{ publicvoidinit(){ ContainercontentPane=getContentPane(); finalJPanelpanel=newJPanel(); JButtonbutton=newJButton("repaint"); panel.setBackground(Color.blue); panel.setPreferredSize(newDimension(100,100)); contentPane.setLayout(newFlowLayout()); contentPane.add(button); contentPane.add(panel); button.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ Colorc=panel.getBackground(); Dimensionsz=panel.getSize(); panel.setBackground( c==Color.blue? Color.red: Color.blue); panel.paintImmediately( 0,0,sz.width,sz.height); //forillustrativepurposesonly try{ Thread.currentThread().sleep(5000); } catch(InterruptedExceptionex){ ex.printStackTrace(); } } }); } } 4.4双缓存 例4-9双缓存测试小应用程序 importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; publicclassDoubleBufferingTestextendsJApplet{ publicvoidinit(){ finalJSliderslider= newJSlider(JSlider.HORIZONTAL,0,100,50); finalContainercontentPane=getContentPane(); JCheckBoxdbcheckBox=newJCheckBox("doublebuffered"); JPanelcontrolPanel=newJPanel(); dbcheckBox.setSelected(true); controlPanel.add(dbcheckBox); slider.setPaintTicks(true); slider.setMinorTickSpacing(5); slider.setMajorTickSpacing(15); contentPane.add(controlPanel,"North"); contentPane.add(slider,"Center"); dbcheckBox.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventevent){ if(event.getStateChange()==ItemEvent.SELECTED){ slider.setDoubleBuffered(true); } else{ slider.setDoubleBuffered(false); } } }); } } 例4-10为组件的容器禁用双缓存 importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; publicclassDoubleBufferingTestextendsJApplet{ publicvoidinit(){ finalContainercontentPane=getContentPane(); JSliderslider=newJSlider(JSlider.HORIZONTAL,0,100,50); JCheckBoxdbcheckBox=newJCheckBox("doublebuffered"); JPanelcontrolPanel=newJPanel(); dbcheckBox.setSelected(true); controlPanel.add(dbcheckBox); slider.setPaintTicks(true); slider.setMinorTickSpacing(5); slider.setMajorTickSpacing(15); contentPane.add(controlPanel,"North"); contentPane.add(slider,"Center"); dbcheckBox.addItemListener(newItemListener(){ publicvoiditemStateChanged(ItemEventevent){ JComponentcp=(JComponent)getContentPane(); JComponentrp=(JComponent)getRootPane(); if(event.getStateChange()==ItemEvent.SELECTED){ rp.setDoubleBuffered(true); cp.setDoubleBuffered(true); } else{ rp.setDoubleBuffered(false); cp.setDoubleBuffered(false); } } }); } } 例4-11调用RepaintManager.getDoubleBufferingEnabled() importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; publicclassDoubleBufferingTestextendsJApplet{ publicvoidinit(){ ContainercontentPane=getContentPane(); JCheckBoxdbcheckBox=newJCheckBox("doublebuffered"); JPanelcontrolPanel=newJPanel(); finalJSliderslider= newJSlider(JSlider.HORIZONTAL,0,100,50); dbcheckBox.setSelected(true); controlPanel.add(dbcheckBox); slider.setPaintTicks(true); slider.setMinorTickSpa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JComponent