Java JFrame未重新喷漆
我已经尝试了至少一个小时来刷新我的简单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
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中是不可变的