0

我有一个带有几个 JPanel 的 JFrame。一种是带有 JButtons GridLayout 的 boardPanel(4 x 4)。另一个是具有 FlowLayout 的 controlPanel,其中包含一个 JTextField 和两个 JButton。

我有两种方法 enableBoard() 和 disableBoard()。在这些方法中,我通过 for 循环将 boardPanel 和 controlPanel 中的每个组件设置为 true 或 false。这一切都发生在摆动计时器运行时。当我启动计时器并因此启动 enableBoard() (它通过 disableBoard 禁用)它有点工作,但通常有延迟,所以并非所有按钮都同时被禁用,我怀疑它与 Timer 有关因为延迟似乎在几秒钟内发生......这里是重要的方法:

public void disableBord() {
    Component[] boardcomps = boardPanel.getComponents();
    for(int i = 0; i < bordcomps.length; i++) {
        boardcomps[i].setEnabled(false);
    }

    Component[] checkComps = controlPanel.getComponents();
    for(int i = 0; i < checkComps.length; i++) {
        checkComps[i].setEnabled(false);
    }
}

public void enableBord() {
    Component[] boardcomps = boardPanel.getComponents();
    for(int i = 0; i < bordcomps.length; i++) {
        boardcomps[i].setEnabled(true);
    }

    Component[] checkComps = controlPanel.getComponents();
    for(int i = 0; i < checkComps.length; i++) {
        checkComps[i].setEnabled(true);
    }
}

和运行的计时器:

timer = new Timer(1000, new ActionListener() {
        int time = game.getSeconds()+4;
        @Override
        public void actionPerformed(ActionEvent e) {
            if (time == game.getSeconds()+4) {
                lblFeedback.setText("3");
                lblTime.setText(game.secToMinSec(game.getSeconds()));
                time--;
            } else if (time == game.getSeconds()+3) {
                lblFeedback.setText("2");
                lbltime.setText(game.secToMinSec(game.getSeconds()));
                time--;
            } else if (time == game.getSeconds()+2) {
                lblFeedback.setText("1");
                lblTime.setText(game.secToMinSec(game.getSeconds()));
                time--;
            } else if (time == game.getSeconds()+1) {
                lblFeedback.setText("Start!");
                lblTime.setText(game.secToMinSec(time));
                time--;
                enableBord();
            } else if(time == 0) {
                lblTime.setText("0:00");
                lblFeedback.setText("Game finished!");
                disableBord();
                game.endeGame();
                timer.stop();
            } else if (time ==  game.getSeconds()) {
                lblTime.setText(game.secToMinSec(time));
                time--;
            } else {
                lblTime.setText(game.secToMinSec(time));
                time--;
            }
        }
    });

延迟看起来像这样:

禁用 JComponent 时的延迟

4

1 回答 1

1

一个适当的 repaint(); 在循环中的每个 setEnable() 似乎都解决了我的问题之后!

于 2013-03-06T17:21:47.333 回答