2015-10-08 94 views
0

此代碼應創建一個框架,其中包含一個標籤,用於打印出時鐘。方法zeitLaeuft()使時鐘工作,並且隨着按鈕'開始'時鐘開始運行。當我調用方法zeitLaeuft()時,代碼失敗。我試過幾件事,現在我知道是因爲標籤jLUhr。在方法zeitLaeuft()中,調用方法jLUhr.setText()的兩個訂單失敗。我試圖設置標籤文本並將該方法註釋掉,但它不起作用。JLabel setText()方法不起作用

什麼問題?

package uhr; 

import javax.swing.*; 
import javax.swing.JLabel; 

import java.awt.Font; 
import java.awt.event.*; 
import java.text.DecimalFormat; 
import java.util.concurrent.TimeUnit; 

public class Uhr1 extends javax.swing.JFrame { 

    public Uhr1() { 
     super(); 
     initGUI(); 
    } 

    private static JLabel jLUhr; 
    private static JButton jBtnStart; 
    private static int stunden = 0, minuten = 0; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       Uhr1 uhr = new Uhr1(); 
       uhr.setVisible(true); 
       uhr.setLocationRelativeTo(null); 
      } 
     }); 

    } 

    public void initGUI() { 
     try { 
      setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
      this.setTitle("Uhr"); 
      getContentPane().setLayout(null); 

      { 
       JLabel jLUhr = new JLabel(); //Uhr = clock in german 
       add(jLUhr); 
       jLUhr.setBounds(49, 89, 300, 100); 
       jLUhr.setHorizontalAlignment(SwingConstants.CENTER); 
       jLUhr.setVerticalAlignment(SwingConstants.CENTER); 

      } 

      { 
       JButton jBtnStart = new JButton(); 
       add(jBtnStart); 
       jBtnStart.setBounds(49, 219, 80, 30); 
       jBtnStart.setText("Start"); 
       jBtnStart.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent evt) { 
         start(evt); 
        } 
       }); 
      } 

      pack(); 
      setSize(400,300); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    public static void zeitLaeuft() { 

     while(true) { 

       if(minuten < 60) { 
        int i; 

        try { 
         for(i = 0; i < 60; i++){ 
         jLUhr.setText(Integer.toString(stunden) + " : " + Integer.toString(minuten)); //this is where the code fails 
         TimeUnit.SECONDS.sleep(1); 
         jLUhr.setText(Integer.toString(stunden) + " " + Integer.toString(minuten)); //this is where the code fails 
         } 
         minuten++; 
         i = 0; 
        } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       else if(minuten == 60) { 
        minuten = 0; 
        if(stunden < 24) { 
         stunden ++; 
         } 
        else { 
         stunden = 0; 
        } 
       } 
      } 
    } 

    public void start(ActionEvent evt) { 
     zeitLaeuft(); //this is where the code fails 
    } 

} 
+1

1)*「..代碼失敗..」*始終複製/粘貼錯誤和異常輸出! 2)請參閱[什麼是堆棧跟蹤,以及如何使用它來調試我的應用程序錯誤?](http://stackoverflow.com/q/3988788/418556)&[什麼是空指針異常,以及如何我修復它?](http://stackoverflow.com/q/218384/418556) –

+1

3)'getContentPane()。setLayout(null);'Java GUI必須在不同的操作系統上工作',屏幕大小,屏幕分辨率等。在不同的地區使用不同的PLAF。因此,它們不利於像素的完美佈局。請使用佈局管理器或[它們的組合](http://stackoverflow.com/a/5630271/418556)以及[white space]的佈局填充和邊框(http://stackoverflow.com/a/17874718/ 418556)。 –

回答

2

此:

JLabel jLUhr = new JLabel(); //Uhr = clock in german 

...聲明&創建一個局部變量,其範圍在方法結束時丟失。它應該是:

jLUhr = new JLabel(); //Uhr = clock in german 

這是訪問全局變量。

+0

非常感謝你:-)我怎麼能看不到? :D –

+0

1)如果幫助解決問題,請[接受答案](http://meta.stackexchange.com/a/5235/155831)。 2)'while(true){'這會阻塞事件分派線程。不要阻塞EDT(Event Dispatch Thread)。發生這種情況時,GUI將「凍結」。有關詳細信息和修補程序,請參見[Swing中的併發](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –