2013-04-05 67 views
0

我看了很多地方,無法找到如何自動刷新我的框架。它確實工作(因爲我已經使用了很多例子),當我點擊按鈕,但不是自動的。平滑組件在修改或循環後自動刷新(例如:定時器)

我想創建一個MineSweeper遊戲,並且我在其中添加Timer,除了定時器計數外,其他所有工作都可以使用,但只有在單擊按鈕時纔會更新。因此,簡單地重做佈局將無法正常工作...

堅韌我知道我的計時器工作,如果我把一個System.out中,我看到它在穩定的二次率。

我會在下面寫一個小程序,而不是我的遊戲,因爲代碼太長了,但是我建了一個小小的程序,解決了它的問題。

在這種情況下,我沒有從我的其他程序開發良好的按鈕,但時間只會刷新,當我搞亂了窗口。

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

http://docs.oracle.com/javase/6/docs/api/javax/swing/JPanel.html#JPanel() – 2013-04-05 18:22:42

回答

1

JPanel in puzzle game not updating

改變組件後,你需要 '刷新' 的Swing組件通過調用invalidate() or revalidate()

+0

那麼,它會不會像工作,對幾個原因。 1.這是主要的,因此它需要被正確調用, test1.pan.updateUI(); 2.我的平臺不是由班級調用,而是由我的center()函數調用的,因此不能這樣調用。 堅韌,我發現只需添加一個frame.setVisible(true);在更新完成更新之後,如果對於同一幀有其他更新,那麼它就不是那麼流暢。 是否有可能以某種方式更準確地更新該特定組件?沒有弄亂幀的其餘部分?爲什麼我不能按下按鈕? – Draeven 2013-04-07 12:10:05

+0

我發現這個鏈接,我認爲它可以幫助http://stackoverflow.com/questions/3078178/jpanel-in-puzzle-game-not-updating「更改組件後,你需要通過調用'刷新'Swing組件無效()或重新驗證()「 – 2013-04-07 17:57:05

+0

好吧,我試過revalidate(),它必須單獨做每個組件,所以它不會混淆與其他的,很棒!我在count()(這是我的計時器循環中的任務)中添加了timer1.setText(timing),然後timer1.revalidate();現在可以像魅力一樣工作,謝謝!工作完成! – Draeven 2013-04-08 20:10:24

0

這裏是JavaNewb想法的答案,使用重新驗證();

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