0

我已经尝试了至少一个小时来刷新我的简单 Jframe。我已经尝试过repaint() revalidate;互联网上的任何其他内容。

这是我的整个班级:

    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();


    }
}

我究竟做错了什么?

4

1 回答 1

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();

    }
}

现在,代替 a Thread,您可以考虑使用 aSwingWorker代替...

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();

    }
}
于 2013-11-11T23:02:59.387 回答