java动态改变JLabel的text问题

今天在写程序时,在某个方法中动态设置JLabel的setText()时,遇到了问题!

点击按钮使JLabel的text显示为"连接服务器",当执行完服务器程序时,若登录错误,显示“失败”原程序:

public void jButton1_actionPerformed(ActionEvent e) {
???? jLabel4.setText("连接服务器……");
???? String name,password;
???? name=jTextField1.getText();
???? password=new String(jPasswordField1.getPassword(),0,jPasswordField1.getPassword().length);
???? Logins yn=new Logins(name,password);
???? if(yn.yesno()){
????? this.setVisible(false);
????? qq.setVisible(true);
???? }else{jLabel4.setText("对不起,登录失败");
???? }
??? }

但是,设置了总是错误,上网请教了高手,得到原因是:

jButton1_actionPerformed 是 event handler,當他被觸發執行時是在 event-dispatching thread,UI 元件的外觀繪製也是在 event dispatching thread。在 jButton1_actionPerformed 第一次去設定 jLabel4 的 text property,儘管這會導致 jLabel4 參考的元件 repaint,但是 repaint 必須等到 jButton1_actionPerformed 執行完,接著 jButton1_actionPerformed 執行完之前又設定了 jLabel4 的 text property,於是當 jLabel4 有機會做 repaint(在 event-dispatching thread 執行其 paint method),他會依照其目前的狀態會繪製外觀(這時其 text property 已是 "對不起,登陸失敗")。

撇開以上的狀況,如果是由 event-dispatching thread 以外的 thread 去變更 JLabel text property,如果兩次變更 text property 的操作過於接近(在時間上),也會發生肉眼不易觀察(沒觀察到)第一次設定的值(人眼一秒能看到的變化大約只有 30 次)。

修改后???

以下只写了事件方法:

//单击按钮事件,使标签文字改变,获得焦点

public void jButton1_actionPerformed(ActionEvent e) {
??????? jLabel4.setText("连接服务器...");
??????? jLabel4.requestFocusInWindow(); }

//标签获得焦点,触发需要执行事件发生

??? public void jLabel4_focusGained(FocusEvent e) {
??????? String name,password;
??????? name=jTextField1.getText();
??????? password=new String(jPasswordField1.getPassword(),0,jPasswordField1.getPassword().length);
??????? Logins yn=new Logins(name,password);
??????? if(yn.yesno()){
???????? this.setVisible(false);
???????? qq.setVisible(true);
??????? }else{
????????????????? jButton1.requestFocusInWindow();
??????? }}

//在标签获得焦点后,若登录不成功,则 jButton1.requestFocusInWindow();按钮获得焦点,相应JLabel4失去焦点
public void jLabel4_focusLost(FocusEvent e) {
???????? jLabel4.setText("对不起,登录失败");}

这样就达到了目的!

???????

你可能感兴趣的:(java,thread,UI,qq)