Java JFrame未重新喷漆

Java JFrame未重新喷漆,java,swing,jframe,repaint,Java,Swing,Jframe,Repaint,我已经尝试了至少一个小时来刷新我的简单Jframe。我尝试了repaint()重新验证以及互联网上的任何其他内容 这是我的全班同学: import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingConstants; public final class BRUTEFORCE

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

这是我的全班同学:

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


    }
}

我做错了什么?

有两件事出了问题。第一个线程不断地感觉到事件队列中有更新请求,可能比事件队列处理更新请求的速度更快,这最终可能会淹没事件队列,从而降低系统的性能

其次,您从未实际更改
textlab

例如

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

    }
}

现在,代替<代码>线程< /代码>,您可以考虑使用<代码> SWIGWORKER 而不是…

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

    }
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.util.List;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.SwingConstants;
导入javax.swing.SwingUtilities;
导入javax.swing.SwingWorker;
公共类暴力{
静态瞬态整数密码=0;
静态JFrame;
公共静态void main(字符串[]args){
//创建并设置窗口。
frame=newjframe(“简单GUI”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JLabel textLabel=新的JLabel(“尝试的密码:”+密码,SwingConstants.CENTER);
textLabel.setPreferredSize(新尺寸(300100));
frame.getContentPane().add(textLabel,BorderLayout.CENTER);
//显示窗口。
frame.setLocationRelativeTo(空);
frame.pack();
frame.setVisible(true);
SwingWorker worker=新SwingWorker(){
@凌驾
受保护的无效进程(列表块){
//只关心最后一个。。
int value=chunks.get(chunks.size()-1);
text label.setText(“尝试的密码:+value”);
}
@凌驾
受保护的整数doInBackground()引发异常{
while(true){
//执行长时间运行的进程。。。
//模拟长时间运行过程的强制延迟
睡眠(5);
密码++;
发布(密码);
}
}
};
worker.execute();
}
}

我认为你的两个线程基本上淹没了事件队列。我不认为这是可能的,我在线程之前尝试了所有的重新验证,但没有任何改变。。。(在密码中添加了一个,并在它进入线程之前尝试刷新)您希望您的
JLabel
如何知道它的初始
String
值需要更新?如何更改文本?我已尝试将初始值设置为密码:“+密码”-感谢更新您需要设置
JLabel
的文本,更改变量对标签显示内容没有影响…@MadProgrammer我假设在使用变量创建
JLabel
时,在更新时,它将更改
字符串
在Java中是不可变的