解决方案 »
- JAVA在控制台上打印五角星
- 传参的本使用中的问题
- 用JasperReport输出PDF格式报表出错!
- 如何將字符以特定屬性保存輸出到圖片文件中
- 如何通过菜单项切换到某个dialog?
- 关于数据类型转换,请问如何将String M = "13911223344";转换成数值类型?
- O'Reilly <Java Data Object>中的UML图使用什么工具做的
- 初学者请教大家
- 请问java的GUI界面如何实现缩放窗口时组件不跟着变形,100分发上兑现
- 在数据库方面,JAVA,DELPHI和VB谁更方便一些?
- 求助!急!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》