`

Swing页面属性的设置顺序

阅读更多
这是一个细节问题,但细节问题关乎一个软件的设计成败,我想这个例子可以充分说明这个问题。

问题是这样产生的,我给一个JPanel设置了一幅背景图片,结果我发现绘制图像的protected void paintComponent(Graphics g)方法,总是调用两次,于是着手调查原因,因为连续调用联系protected void paintComponent(Graphics g)方法,并将占用大量的时间,让Swing页面加载明显减慢。当您的protected void paintComponent(Graphics g)方面里有复杂和大量的画图程序时,加载变慢更加明显。

最后我发现protected void paintComponent(Graphics g)之所以连续调用两次,竟然因为以下两行代码:
setSize(610, 440);
setVisible(true);


如果我把这两行代码颠倒顺序,程序就只调用protected void paintComponent(Graphics g)一次:
setVisible(true);	
setSize(610, 440);


另外这两行代码的顺行竟然还会影响您页面的显示效果,您也许觉得玄乎,请看画面:
当我们用setVisible(true);setSize(610, 440);顺序执行程序时,显示页面:

protected void paintComponent(Graphics g)方法调用一次,页面也显示正常。

当我们用setSize(610, 440);setVisible(true);顺序执行程序时,显示页面:

protected void paintComponent(Graphics g)方法调用两次,页面也显示不正常,请大家注意红框位置。

好了现在大家知道了吧,我们在Swing设置显示顺行的时候,要把设置窗体尺寸大小方法setSize放在窗体可见方法setVisible后面。如下:
private MainFrame01() {
		setTitle("ZakiSoft Demo");
		con = getContentPane();
		ZPanel zp = new ZPanel();
		zp.setBackground(new javax.swing.ImageIcon(getClass()
				.getResource("/com/zakisoft/frame02/demo.jpg")));

		con.add(zp);

		setVisible(true);    
		setSize(610, 440);

		setResizable(false);
		setLocationRelativeTo(getOwner());
		setDefaultCloseOperation(EXIT_ON_CLOSE);

	}


之所以会产生以上的现象,我查看了源码问题可能出在Component类的repaintParentIfNeeded方法。
 private void repaintParentIfNeeded(int oldX, int oldY, int oldWidth,
                                       int oldHeight) 
    {
        if (parent != null && peer instanceof LightweightPeer && isShowing()) {
            // Have the parent redraw the area this component occupied.
            parent.repaint(oldX, oldY, oldWidth, oldHeight);                    
            // Have the parent redraw the area this component *now* occupies.
            repaint();
        }
    }

如果我们提前设置了setVisible,可以减少一次repaint();

附件是一个完整的例子,运行代码可以给一个JPanel设置背景图片。

文章地址:http://javapub.iteye.com/blog/763970
9
0
分享到:
评论
3 楼 askjsp 2010-09-19  
yeah,you are so good and so carefull.
2 楼 qingtian16265 2010-09-17  
有基础的积累才是真...受教了...谢谢分享哈
1 楼 k_scott 2010-09-16  
很基础的东西 呵呵 

相关推荐

    BorderLayout:一个 Android 布局,如 SWing 中 JFrame 的 BorderLayout

    使用`addView()`方法添加组件到特定区域时,可以通过设置LayoutParams的Gravity属性来指定组件的位置。例如: ```java FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup....

    jQuery动画-让页面动起来.doc

    此外,动画队列 (`queue()`) 可以管理动画的执行顺序,确保动画按照预定的顺序依次进行。使用 `$.fn.dequeue()` 或 `$.fx.start()` 可以启动动画队列,`$.fn.stop()` 则可以停止当前正在运行的动画。 五、自定义...

    2021-2022计算机二级等级考试试题及答案No.19368.docx

    当控件的Enabled属性被设置为False时,该控件变为不可用状态,用户无法与其进行任何交互,包括将光标置于其上。 ### 4. Java Swing 中包含菜单条的容器 题目问及哪个Swing组件可能包含菜单条,正确答案是 **Frame*...

    设置tab控件的标签的位置和size

    - Python的Tkinter中,`ttk.Notebook`类提供了`add()`方法创建新标签,并通过`configure()`方法设置标签属性,如`padding`来调整大小。 - 在HTML/CSS中,Bootstrap框架提供了预定义的样式,通过CSS的`flexbox`或`...

    2021-2022计算机二级等级考试试题及答案No.9438.docx

    7. Word文档设置:在Word中,通过【文件】菜单的【页面设置】(正确答案)可以调整文档的版面规格,如纸张大小、边距等。 8. 数据库管理:在数据库中彻底删除记录通常需要两个步骤:PACK和ZAP(A)。PACK用于压缩...

    2021-2022计算机二级等级考试试题及答案No.17473.docx

    - **解释**: `BorderStyle`控制窗体边框样式,`Name`是窗体的名称,`BackColor`设置背景颜色,而`Caption`才是用于设置窗体标题的属性。 #### 5. 字长的概念 - **知识点**: 字长是指计算机能同时处理的二进制信息的...

    2021-2022计算机二级等级考试试题及答案No.1967.docx

    例如,`BackStyle` 属性用于设置控件是否具有自己的背景色或是否透明,允许窗体背景透过控件显示出来。 - **选项解析:** - `Appearance` 属性用于设置控件外观。 - `BorderStyle` 属性用于设置控件边框样式。 - ...

    拉开帷幕的jquery代码

    在元素的CSS样式中设置适当的过渡效果,当jQuery触发属性改变时,浏览器会自动播放过渡动画。 5. **交互性**:为了增加用户体验,还可以添加交互触发帷幕打开的功能,比如点击按钮、滚动页面或悬停某个元素。使用`....

    2021-2022计算机二级等级考试试题及答案No.18710.docx

    2. 设置窗体标题:在VB或类似的编程环境中,设置窗体的标题通常使用Caption属性,如Me.Caption="改变字体大小"。 3. 十六进制整数:0xC5是十六进制表示的整数,转换成十进制是197。 4. SQL 语言功能:SQL...

    计算机程序(Java)

    要使 Java Applet 在 Web 页面上显示,需要在 HTML 文件中使用 `<applet>` 标签,并指定 Applet 的类名、宽度和高度等属性。例如: ```html <applet code="SZJSQ.class" width="400" height="180"></applet> ``` ##...

    2021-2022计算机二级等级考试试题及答案No.19163.docx

    6. 标签控件的Alignment属性用于控制其内容的对齐方式,居中显示即设置该属性。 7. C语言中,main函数的位置没有严格规定,每行可以写多条语句,且没有内置的输入输出语句。预处理阶段会检查宏定义的语法错误。 8....

    2021-2022计算机二级等级考试试题及答案No.3804.docx

    `TreeMap`和`HashMap`都可用于存储键值对,前者按键的自然顺序或自定义比较器排序,后者不保证键的任何特定顺序;`TreeSet`用于存储有序的唯一元素集合,也不支持映射关系。 ### 9. C语言中的自动变量 - **知识点*...

    2021-2022计算机二级等级考试试题及答案No.1720.docx

    18. **Swing组件**:Swing是在AWT基础上构建的新图形界面系统,提供了AWT的所有功能,其组件主要用Java代码实现,并且Swing组件是轻量级的。 19. **操作系统**:操作系统是系统软件的核心,负责管理计算机的硬件...

    2021-2022计算机二级等级考试试题及答案No.4700.docx

    16. 要使标签能透出窗体背景,需设置BackStyle属性为透明。 17. HTML中,`<ol>`标记用于创建有序列表,即带有数字列表符号的列表。 18. 在PowerPoint2003的幻灯片浏览视图中可以调整幻灯片的顺序,而不是在幻灯片...

    2021-2022计算机二级等级考试试题及答案No.17958.docx

    3. 容器布局管理器:Java Swing中的Panel和Applet默认使用FlowLayout布局管理器,它按照从左到右、从上到下的顺序排列组件。 4. HTML页面标题标记:在HTML文档中,用于表示页面标题的标记是对`<title>`和`</title>`...

    2021-2022计算机二级等级考试试题及答案No.4791.docx

    23. **复选框控件**:在Web或桌面应用中,复选框的value属性可以设置为True或False(在某些编程语言中是1或0),表示选中或未选中状态。 24. **删除命令**:在文档处理软件中,删除命令通常将数据移除而不会放到...

    2021-2022计算机二级等级考试试题及答案No.19375.docx

    8. Word中的页边距设置影响文档的打印或显示,保持合适的距离可以使页面布局更加美观。 9. 冯·诺依曼结构是现代计算机的基础,存储程序控制原理意味着程序和数据存储在内存中,按顺序执行。 10. 选择操作对象是...

    存储管理——动态分区分配算法的模拟

    - 内核将物理页面划分为不同的区域,每个区域具有特定的属性和用途。这种分区策略有助于优化内存使用,避免某些物理地址上的页面被用于不合适的场景。 #### 四、设计实现细节 为了完成此次设计任务,需要重点考虑...

    FlowLayout

    它的主要属性包括对齐方式、行间距和列间距,可以通过FlowLayout类的构造函数或setAlignment、setHgap和setVgap方法来设置。 1. **对齐方式**:FlowLayout提供了三种对齐方式:LEFT_ALIGNMENT(左对齐,默认),...

Global site tag (gtag.js) - Google Analytics