为什么不在框架上绘制字符串?

时间:2017-12-22 08:26:06

标签: java interface event-handling awt

我已尝试使用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);
    }
}

1 个答案:

答案 0 :(得分:1)

  1. Java GUI必须使用不同语言环境中的不同PLAF来处理不同的操作系统,屏幕大小,屏幕分辨率等。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them以及white space的布局填充和边框。鉴于框架的高度不足以显示第二个按钮,此建议与此GUI尤其相关。
  2. 不要在一个GUI中混合使用AWT(Frame)和Swing(JOptionPane)组件。选择一个GUI工具包并坚持下去。
  3. 在更改现有方法的行为或实现接口的方法时,始终使用@Override表示法。这样做会警告您,KeyListenerActionListener接口都没有定义public void paint(Graphics)方法!
  4. 定义合并的KeyListenerActionListener没有多大意义,并且让您误以为使用组合侦听器调用Button.addActionListener(..)也会将其添加为KeyListener。它不会。
  5. new Font("Arial", Font.PLAIN, 35)对于跨平台的健壮性,应该是new Font(Font.SANS_SERIF, Font.PLAIN, 35)(例如,OS X通常不会安装Arial字体,并且用户更愿意在任何情况下看到Helvetica。)
  6. 无需设置框架的字体,也无需设置paint方法中的字体。只需在框架中执行一次。
  7. 由于帧本身不可聚焦,因此调用addKeyListener(..)将无效。最好在任何情况下使用Swing并实现键绑定。
  8. 自定义绘画时,请先调用超级方法。
  9. 应在EDT上启动Swing和AWT GUI。
  10. “即使没有错误它也不起作用。”上面的代码中有很多错误,只是它们既不是编译错误,也不是运行时错误抛出异常。即使编译器或虚拟机无法识别代码,代码仍然可能出错。这就是'cut& amp;粘贴'编码没有理解代码的作用,从不起作用。点击教程并阅读Java文档。