这是一个细节问题,但细节问题关乎一个软件的设计成败,我想这个例子可以充分说明这个问题。
问题是这样产生的,我给一个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
分享到:
相关推荐
使用`addView()`方法添加组件到特定区域时,可以通过设置LayoutParams的Gravity属性来指定组件的位置。例如: ```java FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup....
此外,动画队列 (`queue()`) 可以管理动画的执行顺序,确保动画按照预定的顺序依次进行。使用 `$.fn.dequeue()` 或 `$.fx.start()` 可以启动动画队列,`$.fn.stop()` 则可以停止当前正在运行的动画。 五、自定义...
当控件的Enabled属性被设置为False时,该控件变为不可用状态,用户无法与其进行任何交互,包括将光标置于其上。 ### 4. Java Swing 中包含菜单条的容器 题目问及哪个Swing组件可能包含菜单条,正确答案是 **Frame*...
- Python的Tkinter中,`ttk.Notebook`类提供了`add()`方法创建新标签,并通过`configure()`方法设置标签属性,如`padding`来调整大小。 - 在HTML/CSS中,Bootstrap框架提供了预定义的样式,通过CSS的`flexbox`或`...
7. Word文档设置:在Word中,通过【文件】菜单的【页面设置】(正确答案)可以调整文档的版面规格,如纸张大小、边距等。 8. 数据库管理:在数据库中彻底删除记录通常需要两个步骤:PACK和ZAP(A)。PACK用于压缩...
- **解释**: `BorderStyle`控制窗体边框样式,`Name`是窗体的名称,`BackColor`设置背景颜色,而`Caption`才是用于设置窗体标题的属性。 #### 5. 字长的概念 - **知识点**: 字长是指计算机能同时处理的二进制信息的...
例如,`BackStyle` 属性用于设置控件是否具有自己的背景色或是否透明,允许窗体背景透过控件显示出来。 - **选项解析:** - `Appearance` 属性用于设置控件外观。 - `BorderStyle` 属性用于设置控件边框样式。 - ...
在元素的CSS样式中设置适当的过渡效果,当jQuery触发属性改变时,浏览器会自动播放过渡动画。 5. **交互性**:为了增加用户体验,还可以添加交互触发帷幕打开的功能,比如点击按钮、滚动页面或悬停某个元素。使用`....
2. 设置窗体标题:在VB或类似的编程环境中,设置窗体的标题通常使用Caption属性,如Me.Caption="改变字体大小"。 3. 十六进制整数:0xC5是十六进制表示的整数,转换成十进制是197。 4. SQL 语言功能:SQL...
要使 Java Applet 在 Web 页面上显示,需要在 HTML 文件中使用 `<applet>` 标签,并指定 Applet 的类名、宽度和高度等属性。例如: ```html <applet code="SZJSQ.class" width="400" height="180"></applet> ``` ##...
6. 标签控件的Alignment属性用于控制其内容的对齐方式,居中显示即设置该属性。 7. C语言中,main函数的位置没有严格规定,每行可以写多条语句,且没有内置的输入输出语句。预处理阶段会检查宏定义的语法错误。 8....
`TreeMap`和`HashMap`都可用于存储键值对,前者按键的自然顺序或自定义比较器排序,后者不保证键的任何特定顺序;`TreeSet`用于存储有序的唯一元素集合,也不支持映射关系。 ### 9. C语言中的自动变量 - **知识点*...
18. **Swing组件**:Swing是在AWT基础上构建的新图形界面系统,提供了AWT的所有功能,其组件主要用Java代码实现,并且Swing组件是轻量级的。 19. **操作系统**:操作系统是系统软件的核心,负责管理计算机的硬件...
16. 要使标签能透出窗体背景,需设置BackStyle属性为透明。 17. HTML中,`<ol>`标记用于创建有序列表,即带有数字列表符号的列表。 18. 在PowerPoint2003的幻灯片浏览视图中可以调整幻灯片的顺序,而不是在幻灯片...
3. 容器布局管理器:Java Swing中的Panel和Applet默认使用FlowLayout布局管理器,它按照从左到右、从上到下的顺序排列组件。 4. HTML页面标题标记:在HTML文档中,用于表示页面标题的标记是对`<title>`和`</title>`...
23. **复选框控件**:在Web或桌面应用中,复选框的value属性可以设置为True或False(在某些编程语言中是1或0),表示选中或未选中状态。 24. **删除命令**:在文档处理软件中,删除命令通常将数据移除而不会放到...
8. Word中的页边距设置影响文档的打印或显示,保持合适的距离可以使页面布局更加美观。 9. 冯·诺依曼结构是现代计算机的基础,存储程序控制原理意味着程序和数据存储在内存中,按顺序执行。 10. 选择操作对象是...
- 内核将物理页面划分为不同的区域,每个区域具有特定的属性和用途。这种分区策略有助于优化内存使用,避免某些物理地址上的页面被用于不合适的场景。 #### 四、设计实现细节 为了完成此次设计任务,需要重点考虑...
它的主要属性包括对齐方式、行间距和列间距,可以通过FlowLayout类的构造函数或setAlignment、setHgap和setVgap方法来设置。 1. **对齐方式**:FlowLayout提供了三种对齐方式:LEFT_ALIGNMENT(左对齐,默认),...