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

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);
    }
}
答案
  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. 自定义绘画时,请先调用super方法。
  9. 应该在EDT上启动Swing和AWT GUI。
  10. “即使没有错误,它也不起作用。”上面的代码中有很多错误,只是它们既不是编译错误,也不是抛出异常的运行时错误。即使编译器或虚拟机无法识别代码,代码仍然可能出错。这就是为什么“剪切和粘贴”编码没有理解代码的作用,从不起作用。点击教程并阅读Java文档。

以上是关于为什么不在框架上绘制字符串?的主要内容,如果未能解决你的问题,请参考以下文章

在画布上绘制片段视图

Android:如何在 FrameLayout 元素中绘制?

OpenGL不在C++中绘制三角形

Android Studio Map setOnMarkerClickListener 不在片段上工作

为啥 CDC::LineTo() 不在 Visual C++ 2015 MFC 对话框中绘制?

如何在不在 android 的 Activity 上添加地图片段的情况下获取我的位置?