2013-11-11 2 views
0

Я пробовал хотя бы час на освежение моей простой Jframe. Я пробовал repaint()revalidate; и почти что-нибудь еще в Интернете.JFrame не перекрашивает

здесь весь мой класс:

import java.awt.BorderLayout; 
import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingConstants; 


public final class BRUTEFORCE { 
    static int Passwords = 0; 
    static JFrame frame; 
    public static void main(String[] args) { 
     //Create and set up the window. 
     frame = new JFrame("Simple GUI"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JLabel textLabel = new JLabel("Passwords tried: " + Passwords,SwingConstants.CENTER); 
     textLabel.setPreferredSize(new Dimension(300, 100)); 
     frame.getContentPane().add(textLabel, BorderLayout.CENTER); 

     //Display the window. 
     frame.setLocationRelativeTo(null); 
     frame.pack(); 
     frame.setVisible(true); 
     Passwords++; 

     new Thread("Refresh") { 
      public void run() { 
       while(true){ 
        frame.invalidate(); 
        frame.validate(); 
        frame.repaint(); 
       } 
      } 
     }.start(); 
     new Thread("Test") { 
      public void run() { 
       while(true) Passwords++; 
      } 
     }.start(); 


    } 
} 

Что я делаю неправильно?

+1

Я думаю, что вы два потока в основном наводняют очередь событий – MadProgrammer

+0

Я не думал, что это возможно, и я ried все revalidate-ing перед потоками тоже и ничего не изменилось ... (добавлено одно к паролям и попыталось обновить до того, как он ударил потоки) – Chris

+0

Как вы ожидаете, что ваш 'JLabel' должен знать, что его начальное значение« String »необходимо обновить ? – async

ответ

2

Две вещи идут не так. Вы первый поток постоянно ощущаете очередь событий с запросами на обновление, вероятно, быстрее, чем очередь событий может обрабатывать их, что может в конечном итоге наводнить ее, ухудшая производительность системы.

Во-вторых, вы никогда не изменить текст textLabel

К примеру ...

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 

public class BruteForce { 

    static transient int Passwords = 0; 
    static JFrame frame; 

    public static void main(String[] args) { 
     //Create and set up the window. 
     frame = new JFrame("Simple GUI"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JLabel textLabel = new JLabel("Passwords tried: " + Passwords, SwingConstants.CENTER); 
     textLabel.setPreferredSize(new Dimension(300, 100)); 
     frame.getContentPane().add(textLabel, BorderLayout.CENTER); 

     //Display the window. 
     frame.setLocationRelativeTo(null); 
     frame.pack(); 
     frame.setVisible(true); 
     Passwords++; 

     new Thread("Test") { 
      public void run() { 
       while (true) { 
        try { 
         Passwords++; 
         SwingUtilities.invokeLater(new Runnable() { 
          @Override 
          public void run() { 
           textLabel.setText("Passwords tried: " + Passwords); 
          } 
         }); 
         Thread.sleep(5); 
        } catch (InterruptedException ex) { 
         Logger.getLogger(BruteForce.class.getName()).log(Level.SEVERE, null, ex); 
        } 
       } 
      } 
     }.start(); 

    } 
} 

Теперь, вместо Thread, вы могли бы рассмотреть возможность использования SwingWorker вместо ...

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 
import javax.swing.SwingWorker; 

public class BruteForce { 

    static transient int Passwords = 0; 
    static JFrame frame; 

    public static void main(String[] args) { 
     //Create and set up the window. 
     frame = new JFrame("Simple GUI"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JLabel textLabel = new JLabel("Passwords tried: " + Passwords, SwingConstants.CENTER); 
     textLabel.setPreferredSize(new Dimension(300, 100)); 
     frame.getContentPane().add(textLabel, BorderLayout.CENTER); 

     //Display the window. 
     frame.setLocationRelativeTo(null); 
     frame.pack(); 
     frame.setVisible(true); 

     SwingWorker worker = new SwingWorker<Integer, Integer>() { 

      @Override 
      protected void process(List<Integer> chunks) { 

       // Only care about the last one.. 
       int value = chunks.get(chunks.size() - 1); 
       textLabel.setText("Passwords tried: " + value); 

      } 

      @Override 
      protected Integer doInBackground() throws Exception { 
       while (true) { 
       // Perform long running process... 
        // Forced delay to simulate long running process 
        Thread.sleep(5); 
        Passwords++; 
        publish(Passwords); 
       } 
      } 
     }; 
     worker.execute(); 

    } 
} 
+0

как вы меняете текст? У меня есть начальное значение, установленное на '' Пароли: «+ Пароли» - Спасибо за обновление – Chris

+0

@Duck 'setText' обновляет текст вашего' JLabel' – async

+1

Вам нужно установить текст 'JLabel', переменная не влияет на то, что отображается на этикетке ... – MadProgrammer

Смежные вопросы