Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 平滑组件修改或循环后自动刷新(例如:计时器)_Java_Swing_Timer_Jframe_Jpanel - Fatal编程技术网

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