2015-10-08 5 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) & [Что такое исключение Null Pointer и как это сделать? Я исправлю это?] (Http://stackoverflow.com/q/218384/418556) –

+1

3) 'getContentPane(). SetLayout (null);' Java GUIs должны работать на разных ОС, размер экрана, разрешение экрана и т. Д. используя различные PLAF в разных локалях. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (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 (Thread Dispatch Thread). Когда это произойдет, GUI «замерзнет». См. [Параллелизм в Swing] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/) для получения подробной информации и исправления. –