Java 平滑组件修改或循环后自动刷新(例如:计时器)
我找了很多地方都找不到如何自动刷新我的相框。当我点击按钮时,它确实起作用(因为我已经使用了很多例子),但不是自动的 我想创建一个扫雷游戏,我在里面添加了计时器,除了计时器计数外,其他一切都正常,但只有在点击按钮时才会更新。因此,简单地重做布局将不起作用 很难,我知道我的计时器工作正常,如果我把一个系统放进去,我会以稳定的秒速率看到它 我将在下面放一个小程序,不是我的游戏,因为代码太长了,而是我创建的一个小程序,在相同的情况下,修复它将解决我的总体问题 在这种情况下,我的另一个程序中没有完善的按钮,但只有在我弄乱窗口时,时间才会刷新Java 平滑组件修改或循环后自动刷新(例如:计时器),java,swing,timer,jframe,jpanel,Java,Swing,Timer,Jframe,Jpanel,我找了很多地方都找不到如何自动刷新我的相框。当我点击按钮时,它确实起作用(因为我已经使用了很多例子),但不是自动的 我想创建一个扫雷游戏,我在里面添加了计时器,除了计时器计数外,其他一切都正常,但只有在点击按钮时才会更新。因此,简单地重做布局将不起作用 很难,我知道我的计时器工作正常,如果我把一个系统放进去,我会以稳定的秒速率看到它 我将在下面放一个小程序,不是我的游戏,因为代码太长了,而是我创建的一个小程序,在相同的情况下,修复它将解决我的总体问题 在这种情况下,我的另一个程序中没有完善的按钮
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ClockTest {
JFrame frame = new JFrame();
JButton test1 = new JButton();
JTextField timer1 = new JTextField();
int hour = 0, min = 0, sec = 0;
String timing;
public ClockTest() {
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(center(), BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
public Component center() {
JPanel pan = new JPanel();
pan.setLayout(new GridLayout(1,2));
test1.setText("Dummy");
timer1.setEditable(false);
timer1.setText(timing);
pan.add(test1);
pan.add(timer1);
return pan;
}
public void count() {
sec++;
if(sec == 60) {
sec -= 60;
min++;
}
if(min == 60) {
min -= 60;
hour++;
}
timing = hour + ":" + min + " : " + sec;
//This is what i do in my game to refresh, to set flags, get mine "exploded"...
//But since i'm not pressing anything... it does not happen.
frame.add(center(), BorderLayout.CENTER);
}
public static void main(String[]args) {
final ClockTest test1 = new ClockTest();
TimerTask task = new TimerTask() {
public void run() {
test1.count();
}
};
Timer t = new Timer();
t.schedule(task,0,1000);
}
}
更改组件后,您需要通过调用
invalidate()或revalidate()来“刷新”Swing组件。
以下是使用revalidate()的JavaNewb想法的答案
好吧,它不会像那样工作,原因很简单。1.这是主要的,因此需要正确调用test1.pan.updateUI();2.我的pan不是由类调用的,而是由我的center()函数调用的,因此不能这样调用。很难,我发现只需添加一个frame.setVisible(true);在进行更新的更改之后,如果同一帧有其他更新,则不会如此流畅。是否有可能以某种方式更精确地更新该特定组件?不影响画面的其他部分???为什么我不能按下按钮?我找到了这个链接,我认为它可以帮助“在更改组件后,您需要通过调用invalidate()或revalidate()来“刷新”Swing组件”好的,我尝试了revalidate(),它必须对每个组件单独执行,这样就不会干扰其他组件,太好了!!!我在count()中(这是计时器循环中的任务)添加了timer1.setText(计时),然后添加了timer1.revalidate();,现在的作品很有魅力,谢谢!!!工作完成!!!
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
public class ClockTest {
JFrame frame = new JFrame();
JButton test1 = new JButton();
JTextField timer1 = new JTextField();
int hour = 0, min = 0, sec = 0;
String timing;
public ClockTest() {
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(center(), BorderLayout.CENTER);
frame.setResizable(true);
frame.pack();
frame.setVisible(true);
}
public JPanel center() {
JPanel pan = new JPanel();
pan.setLayout(new GridLayout(1,2));
test1.setText("Dummy");
timer1.setEditable(false);
timer1.setText(timing);
pan.add(test1);
pan.add(timer1);
return pan;
}
public void count() {
sec++;
if(sec == 60) {
sec -= 60;
min++;
}
if(min == 60) {
min -= 60;
hour++;
}
timing = " " + hour + ":" + min + " : " + sec;
// Make the modification here on your components, then .revalidate(); them all
timer1.setText(timing);
timer1.revalidate();
}
public static void main(String[]args) {
final ClockTest test1 = new ClockTest();
TimerTask task = new TimerTask() {
public void run() {
test1.count();
}
};
Timer t = new Timer();
t.schedule(task,0,1000);
}
}