0

私は多くの場所を見てきましたが、フレームを自動的に更新する方法がわかりません。ボタンをクリックすると機能しますが(すでに多くの例を使用しているため)、自動的には機能しません。

MineSweeper ゲームを作成したいのですが、タイマーを追加しています。タイマーのカウント以外はすべて機能しますが、ボタンがクリックされたときにのみ更新されます。そのため、単にレイアウトをやり直すだけではうまくいきません...

タイマーが機能することはわかっていますが、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);
}
}
4

2 に答える 2

0

revalidate(); を使用する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);
}
}
于 2013-04-08T20:18:02.343 に答える