更改其内容和pack()时JFrame闪烁

时间:2014-08-04 16:35:12

标签: java swing

我的显示屏只显示页面上的分数:

例如: JIMBOB 总分:22

当得分得分时,会触发一个事件来更新得分并重新绘制页面上的新得分:

public void showScore(String username, int score)
{
    contentPane.remove(layout.getLayoutComponent(BorderLayout.CENTER));
    score.setText("<html>" + username + "<br/>Total Hits: " + totalHits + "</html>");
    contentPane.add(score, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
}

每次对一个点进行评分时,都会调用此函数,它会删除旧的评分消息,然后添加一个新的消息,然后打包并重新绘制。

问题是在绘制更新的帧时窗口会闪烁。而且似乎只需要一瞬间显示未格式化的信息

contentPane是一个Container 和frame是一个JFrame

2 个答案:

答案 0 :(得分:2)

调用pack()将完全重新呈现主机平台拥有的JFrametop-level, heavyweight container。而是更新用于显示修订分数的JComponent。引用了一个完整的例子here。摘录表格RCStatus

public class RCStatus extends JPanel implements Observer {

    /** Update the game's status display. */
    public void update(Observable model, Object arg) {
        // invoke setText() here
    }
}

有关answer的更多信息,请参阅此observer pattern

答案 1 :(得分:1)

首先,我建议您查看Swing中的how to use JPanels和其他GUI组件。您可以使用JPanel添加到contentPane的{​​{1}}。根据您的需要添加所需的LayoutManager that is fitting,并根据您的意愿使用it to position a JLabel

当您拨打JFrame方法时,请使用showScore()上的setText(String text),而不是您提供的JLabel参数。

要使用字符串设置文本,您需要转换int score。您可以执行以下两项操作之一(但使用第一个选项):

int score

如果您希望分数标签显示或消失,请从添加到label.setText(String.valueOf(score)); label.setText("" + score); 的{​​{1}}添加/删除分数标签。添加后,请在标签上调用JPanel以显示分数。然后,由于您重置了标签文字,因此应在JFrame上致电setText()。如果您选择添加/删除repaint()而不是仅更改其文字,则还应在JPanel上致电JLabel

所有函数应该看起来像这样(这是不完整的),假设revalidate()实际上是你的分数。

JPanel

您还可以在totalHits方法中声明并初始化// declare instance fields before constructor // both variables are reachable by showScore() private JPanel scorePanel; private JLabel scoreLabel; // in constructor of your class scorePanel = new JPanel(); // initialize the JPanel scorePanel.setLayout(new BorderLayout()); // give it a layout scoreLabel = new JLabel(); // initialize the label frame.add(scorePanel); // add JPanel to your JFrame // method obviously outside constructor public void showScore(String username, int score) { // clear the JPanel that contains the JLabel to remove it scorePanel.removeAll(); scoreLabel.setText("<html>" + username + "<br/>Total Hits: " + String.valueOf(score) + "</html>"); scorePanel.add(label, BorderLayout.CENTER); scorePanel.revalidate(); scorePanel.repaint(); } JPanel,使其更加本地化。但是,每次调用该函数时,您还需要在JLabel上调用showScore()并清除之前的pack()