我的显示屏只显示页面上的分数:
例如: 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
答案 0 :(得分:2)
调用pack()
将完全重新呈现主机平台拥有的JFrame
,top-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()
。