为什么不在框架上绘制字符串?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么不在框架上绘制字符串?相关的知识,希望对你有一定的参考价值。
我已经尝试使用KeyListener interface
在我的框架上绘制一个字符串,这样每当我在键盘上点击一个可键入的键时,它应该出现在帧上,但即使没有错误它也不起作用。
有人能说出这是什么错误吗?
以下是我的代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class KeyevntFrame2 extends Frame {
Button b = new Button("ok");
Button b1 = new Button("hey");
char ch;
String s = "";
public KeyevntFrame2() {
setTitle("understand key events");
setSize(800, 600);
addKeyListener(new KeyHandler());
setFont(new Font("Arial", Font.PLAIN, 35));
setForeground(Color.BLACK);
add(b);
add(b1);
b.setBounds(200, 200, 100, 100);
b1.setBounds(200, 700, 100, 100);
setLayout(null);
b.addActionListener(new KeyHandler());
b1.addActionListener(new KeyHandler());
}
class KeyHandler implements KeyListener, ActionListener {
public void keyPressed(KeyEvent e) {
ch = e.getKeyChar();
s = s + ch;
repaint();
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void paint(Graphics g) {
g.drawString(s, 300, 200);
g.setFont(new Font("Arial", Font.PLAIN, 35));
}
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(b1, "thank you for using java");
}
}
public static void main(String a[]) {
KeyevntFrame2 f = new KeyevntFrame2();
f.setVisible(true);
}
}
答案
- Java GUI必须使用不同语言环境中的不同PLAF来处理不同的操作系统,屏幕大小,屏幕分辨率等。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them以及white space的布局填充和边框。这个建议与此GUI特别相关,因为框架没有足够的高度来显示第二个按钮。
- 不要在一个GUI中混合使用AWT(
Frame
)和Swing(JOptionPane
)组件。选择一个GUI工具包并坚持下去。 - 在更改现有方法的行为或实现接口的方法时,始终使用
@Override
表示法。这样做会警告你,KeyListener
和ActionListener
接口都没有定义public void paint(Graphics)
方法! - 定义一个组合的
KeyListener
和ActionListener
没有多大意义,并且让你误以为用组合监听器调用Button.addActionListener(..)
也会产生将它添加为KeyListener
的效果。它不会。 new Font("Arial", Font.PLAIN, 35)
用于跨平台稳健性,应该是new Font(Font.SANS_SERIF, Font.PLAIN, 35)
(例如OS X通常不会安装Arial字体,并且用户更愿意在任何情况下看到Helvetica。)- 没有必要设置框架的字体,以及paint方法中的字体。只需在框架中执行一次。
- 由于帧本身不可聚焦,因此调用
addKeyListener(..)
将不起作用。最好在任何情况下使用Swing并实现键绑定。 - 自定义绘画时,请先调用super方法。
- 应该在EDT上启动Swing和AWT GUI。
- “即使没有错误,它也不起作用。”上面的代码中有很多错误,只是它们既不是编译错误,也不是抛出异常的运行时错误。即使编译器或虚拟机无法识别代码,代码仍然可能出错。这就是为什么“剪切和粘贴”编码没有理解代码的作用,从不起作用。点击教程并阅读Java文档。
以上是关于为什么不在框架上绘制字符串?的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何在 FrameLayout 元素中绘制?
Android Studio Map setOnMarkerClickListener 不在片段上工作