关于JLabel使用settext的时候显示刷新的问题

少年包身工 2013-04-18 06:27:01
jl[1].setForeground(Color.blue);
jl[1].setText(jl[1].getText());
jl[1].repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

为什么界面上无论把sleep放哪都会先显示sleep一秒再变蓝色
...全文
867 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw12160 2013-04-21
  • 打赏
  • 举报
回复
受教了啊,thinks
weidu23 2013-04-21
  • 打赏
  • 举报
回复
引用 11 楼 jia20003 的回复:
你的JLabel更本不会去主动刷新的,即使你调用repaint方法。 更本原因在于,Swing的刷新工作机制,必须由父组件触发,开始递给调用每个子组件的repaint方法或者是updateUI()。 结合你的代码,label.repaint()更本不会刷新你的Label,这个代码有点画蛇添足,完全可以去掉 然后在在你的最顶层组件对象上调用repaint()方法即可。……
----------------------------------- 1、他这个代码显然要睡眠的线程错掉了! 2、老兄,有没兴趣,一块帮我解决个问题谢谢,地址:http://bbs.csdn.net/topics/390433479 谢谢
少年包身工 2013-04-21
  • 打赏
  • 举报
回复
引用 9 楼 zqfddqr 的回复:
这是两个不同的线程没有先后顺序的
引用 11 楼 jia20003 的回复:
你的JLabel更本不会去主动刷新的,即使你调用repaint方法。 更本原因在于,Swing的刷新工作机制,必须由父组件触发,开始递给调用每个子组件的repaint方法或者是updateUI()。 结合你的代码,label.repaint()更本不会刷新你的Label,这个代码有点画蛇添足,完全可以去掉 然后在在你的最顶层组件对象上调用repaint()方法即可。……
我即使调用了JFrame的repaint也没用啊
少年包身工 2013-04-21
  • 打赏
  • 举报
回复
引用 8 楼 yichenghao 的回复:
这个涉及到线程问题,在GUI中要显示的东西都是有一个叫做GUI分发线程(好像是叫这个名字)的线程来完成显示及更新活动的,而这个线程是与程序的主线程相关联的,当你用sleep将主线程睡眠的同时,分发线程也跟着休眠了,所以这个时候更新事件被放置,一直等到主线程激活后,分发线程才开始工作,这个时候你的更新命令才得到执行,所以又你上面产生的结果,希望这个回答对你有用。 ……
貌似这听起来很有道理。。。。但是怎么解决呢
gloomyfish 2013-04-19
  • 打赏
  • 举报
回复
你的JLabel更本不会去主动刷新的,即使你调用repaint方法。 更本原因在于,Swing的刷新工作机制,必须由父组件触发,开始递给调用每个子组件的repaint方法或者是updateUI()。 结合你的代码,label.repaint()更本不会刷新你的Label,这个代码有点画蛇添足,完全可以去掉 然后在在你的最顶层组件对象上调用repaint()方法即可。 这个就是为什么每次你要等待1秒的原因,只有等swing顶层组件刷新时,你的JLable就被自动刷新。 对JTable也是一样。
失意 2013-04-18
  • 打赏
  • 举报
回复
虽然是同时进行的但一旦主线程不工作了那么这个分发线程也不动了,可能内部实现上有什么锁吧,因为他这样设计是为了让分发线程的动作要得到主线程的及时响应吧
zqfddqr 2013-04-18
  • 打赏
  • 举报
回复
这是两个不同的线程没有先后顺序的
失意 2013-04-18
  • 打赏
  • 举报
回复
这个涉及到线程问题,在GUI中要显示的东西都是有一个叫做GUI分发线程(好像是叫这个名字)的线程来完成显示及更新活动的,而这个线程是与程序的主线程相关联的,当你用sleep将主线程睡眠的同时,分发线程也跟着休眠了,所以这个时候更新事件被放置,一直等到主线程激活后,分发线程才开始工作,这个时候你的更新命令才得到执行,所以又你上面产生的结果,希望这个回答对你有用。
少年包身工 2013-04-18
  • 打赏
  • 举报
回复
引用 4 楼 u010328515 的回复:
package test; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JLabel; public class GuiTest extends JFrame { private static final long serialVersionUID = ……
我的代码比较乱。。。找不到问题啊,我的方法和你的应该是一样,但是他总是sleep后才变色
少年包身工 2013-04-18
  • 打赏
  • 举报
回复
引用 4 楼 u010328515 的回复:
package test; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JLabel; public class GuiTest extends JFrame { private static final long serialVersionUID = ……
好像是能解决问题,可能我代码的问题不是出在这。。。谢谢了
少年包身工 2013-04-18
  • 打赏
  • 举报
回复
引用 3 楼 u010328515 的回复:
package test; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JLabel; public class GuiTest extends JFrame { private static final long serialVersionUID = ……
我要先变色后sleep,这样还是先sleep后变色
云淡风起 2013-04-18
  • 打赏
  • 举报
回复
package test; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JLabel; public class GuiTest extends JFrame { private static final long serialVersionUID = 1L; JLabel jl; public GuiTest() { //初始化组件 initComponents(); //设置窗口大小 setSize(300, 300); //关闭 setDefaultCloseOperation(EXIT_ON_CLOSE); //可见 setVisible(true); //睡眠,便于观察 try { Thread.sleep(2000); } catch(InterruptedException e) {} //改变背景颜色 jl.setForeground(Color.red); } //初始化组件 /** * 添加一个标签,名字是"blue" * 加入Frame * 设置获取标签(它本身) * 重画 * @throws InterruptedException */ private void initComponents() { jl = new JLabel("blue"); add(jl); jl.setText(jl.getText()); jl.repaint(); jl.setForeground(Color.BLUE); } // test //启动窗口 public static void main(String[] args) { new GuiTest(); } } 你看看是不是这个意思.
云淡风起 2013-04-18
  • 打赏
  • 举报
回复
package test; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JLabel; public class GuiTest extends JFrame { private static final long serialVersionUID = 1L; JLabel jl; public GuiTest() { //初始化组件 initComponents(); //设置窗口大小 setSize(300, 300); //关闭 setDefaultCloseOperation(EXIT_ON_CLOSE); //可见 setVisible(true); //睡眠,便于观察 try { Thread.sleep(2000); } catch(InterruptedException e) {} //改变背景颜色 jl.setForeground(Color.BLUE); } //初始化组件 /** * 添加一个标签,名字是"blue" * 加入Frame * 设置获取标签(它本身) * 重画 * @throws InterruptedException */ private void initComponents() { jl = new JLabel("blue"); add(jl); jl.setText(jl.getText()); jl.repaint(); } // test //启动窗口 public static void main(String[] args) { new GuiTest(); } } 你看看这样行不行?
少年包身工 2013-04-18
  • 打赏
  • 举报
回复
jl是JLabel
请叫我汪海 2013-04-18
  • 打赏
  • 举报
回复
试试看调用repaint方法,可能是没有刷新

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧