解决方案 »
- 求高手指教
- 面试基础题一(如果觉得自己知识掌握牢固了,去面试吧!)
- 好奇怪的问题,大虾进来看看,谢谢
- 字符长度的怪异问题啊....................星星进啊
- File类实例什么时候在目录中创建文件?
- 关于类型转换的问题
- simple question 60 points wait for your picking
- 关于"另存为"的问题,请各位高手关心一下小弟,谢谢!
- java入门级问题
- 可以把二进制数字转成十六制么?
- 求助!急!com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭。
- 求助!请问各位大神,如何使用嵌套的for循环输出以下内容?
换句话说,当你的控件重绘的时候, message 的值是 "" 。要想只用 String,那么试试这样:
class StringPanel extends JPanel {
private String message = "";
//private StringBuffer buffer = new StringBuffer();
public StringPanel() {
addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
//buffer.append(e.getKeyChar());
message += e.getKeyChar();
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
//message = buffer.toString().trim();
repaint(); SwingUtilities.invokeLater(new Runnable() { @Override
public void run() {
message = "";
}
});
//message = ""; // In the correct version, this line is deleted
//buffer.setLength(0);
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
FontMetrics fm = g.getFontMetrics();
int stringAscent = fm.getAscent();
int stringWidth = fm.stringWidth(message);
int x = getWidth() / 2 - stringWidth / 2;
int y = getHeight() / 2 - stringAscent / 2;
g.drawString(message, x, y);
}
}另外从代码效率来考虑的话, String 也好 StringBuffer 也好都是不推荐的, —— 应该用 StringBuilder。代码简单更正如下:class StringPanel extends JPanel {
private String message = "";
private StringBuilder buffer = new StringBuilder();
public StringPanel() { addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) { buffer.append(e.getKeyChar());
}
@Override
public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { message = buffer.toString().trim();
buffer.delete(0, buffer.length());
repaint();
}
}
});
}
@Override
protected void paintComponent(Graphics g) { super.paintComponent(g);
FontMetrics fm = g.getFontMetrics();
int stringAscent = fm.getAscent();
int stringWidth = fm.stringWidth(message);
int x = getWidth() / 2 - stringWidth / 2;
int y = getHeight() / 2 - stringAscent / 2;
g.drawString(message, x, y);
}
}(上面两个示例代码都没有测试,也许有错误)
google搜索: Java Swing EDT, Swing 绘制原理, Swing 线程 ……
或者阅读: 《Filthy Rich Clients》