Filed Under (JAVA工程坊) by 有为 on 03-05-2012
初始问题:super.paintComponent到底做了什么,以至于子类覆盖时必须调用它?
不妨从源码里追溯一下
首先查看JPanel。其定义public class JPanel extend JComponent
找了一下,发现JPanel里没有paintComponent方法
继续找其父类,在JComponent里找到了paintComponent,其代码片段如下
protected void paintComponent(Graphics g) {
if (ui != null) {
Graphics scratchGraphics = SwingGraphics.createSwingGraphics(g);
try {
ui.update(scratchGraphics, this);
}
finally {
scratchGraphics.dispose();
}
}
}
新的问题产生:
为什么要创建一个scratchGraphics?
ui.update更新了什么?
为什么要dispose一下?
我们逐个来解决。
首先,追踪createSwingGraphics方法
public static Graphics createSwingGraphics(Graphics g) {
if (g == null) {
Thread.dumpStack();
return null;
}
return g.create();
}
发现只是简单的调用了一下Graphics接口的create方法,建立了一个新的图对象。
接着,看ui.update
public void update(Graphics g, JComponent c) {
if (c.isOpaque()) {
g.setColor(c.getBackground());
g.fillRect(0, 0, c.getWidth(),c.getHeight());
}
paint(g, c);
}
利用上一步所创建的图对象,把组件的背景色画了出来。
最后一个dispose,查看Graphics接口的源码,根据Graphics对dispose方法的说明,此方法是丢弃Graphics,并释放其所占内存资源的。看来这句话的作用就是把用来画背景色的图对象抛弃了。
根据以上追踪,我们发现paintComponenet的作用是给组件画上背景色。
如果不调用此方法,我们之前对JPanel设置的背景色等属性将不会被展现。
而且根据源代码,我们发现涂背景时机也是有讲究的。
如果此方法在子类的实现中最先被调用,背景就处于最底下的一层,子类其他利用g进行的绘图将在有一个背景的基础下进行。
如果此方法没有最先被调用,在此方法前所做的绘图动作都会被画出来的背景overwrite。
结论:paintComponent方法应该要被所有子类调用,而且是在最先调用。
Filed Under (mysql学习) by 有为 on 06-03-2012
参考来源:http://pppcode.blog.51cto.com/2698464/510972
介绍一个非常有用的mysql启动参数 –skip-grant-tables。顾名思义,就是在启动mysql时不启动grant-tables,授权表。有什么用呢?当然是忘记管理员密码、mysql数据库中user表出问题等后有用。
操作方法:
1、杀掉原来进行着的mysql;
2、以命令行参数启动mysql:
/usr/bin/mysqld_safe –skip-grant-tables &
3、修改管理员密码;
use mysql; update user set password=password(’yournewpasswordhere’) where user=’root’;
flush privileges;
exit;
4、重启mysql;
如果你在my.cnf中的有添加”skip-grant-tables”,那么任何的帐号用任何的密码(当然也包括空)都可以登录到mysql数据库了。
参考来源:http://pppcode.blog.51cto.com/2698464/510972
介绍一个非常有用的mysql启动参数 –skip-grant-tables。顾名思义,就是在启动mysql时不启动grant-tables,授权表。有什么用呢?当然是忘记管理员密码、mysql数据库中user表出问题等后有用。
操作方法:
1、杀掉原来进行着的mysql;
2、以命令行参数启动mysql:
/usr/bin/mysqld_safe –skip-grant-tables &
3、修改管理员密码;
use mysql; update user set password=password(’yournewpasswordhere’) where user=’root’;
flush privileges;
exit;
4、重启mysql;
如果你在my.cnf中的有添加”skip-grant-tables”,那么任何的帐号用任何的密码(当然也包括空)都可以登录到mysql数据库了。
Filed Under (DIV+CSS样式) by 有为 on 30-11-2011
常见错误
1. 检查HTML元素是否有拼写错误、是否忘记结束标记
即使是老手也经常会弄错div的嵌套关系。可以用dreamweaver的验证功能检查一下有无错误。
2. 检查CSS是否正确
检查一下有无拼写错误、是否忘记结尾的 } 等。可以利用CleanCSS来检查 CSS的拼写错误。CleanCSS本是为CSS减肥的工具,但也能检查出拼写错误。
3. 确定错误发生的位置
如果错误影响了整体布局,则可以逐个删除div块,直到删除某个div块后显示恢复正常,即可确定错误发生的位置。
4. 利用border属性确定出错元素的布局特性
使用float属性布局一不小心就会出错。这时为元素添加border属性确定元素边界,错误原因即水落石出。
5. float元素的父元素不能指定clear属性
MacIE下如果对float的元素的父元素使用clear属性,周围的float元素布局就会混乱。这是MacIE的著名的bug,倘若不知道就会走弯路。
6. float元素务必指定width属性
很多浏览器在显示未指定width的float元素时会有bug。所以不管float元素的内容如何,一定要为其指定width属性。
另外指定元素时尽量使用em而不是px做单位。
7. float元素不能指定margin和padding等属性
IE在显示指定了margin和padding的float元素时有bug。因此不要对float元素指定margin和padding属性(可以在float元素内部嵌套一个div来设置margin和padding)。也可以使用hack方法为IE指定特别的值。
8. float元素的宽度之和要小于100%
如果float元素的宽度之和正好是100%,某些古老的浏览器将不能正常显示。因此请保证宽度之和小于99%。
9. 是否重设了默认的样式?
某些属性如margin、padding等,不同浏览器会有不同的解释。因此最好在开发前首先将全体的margin、padding设置为0、列表样式设置为none等。
10. 是否忘记了写DTD?
如果无论怎样调整不同浏览器显示结果还是不一样,那么可以检查一下页面开头是不是忘了写下面这行DTD:<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
Filed Under (网站创意) by 有为 on 15-11-2011
1.效果图

效果图1

效果图2
2.网址:http://www.pmol.org.cn
Filed Under (网站创意) by 有为 on 15-11-2011
1.效果图

效果图1

效果图2
2.网址:http://sss.synu.edu.cn