【问题标题】:How to make key events work on a JDialog while there is a JTextArea on it?当 JDialog 上有 JTextArea 时,如何使关键事件在 JDialog 上起作用?
【发布时间】:2015-04-12 21:57:26
【问题描述】:

我基本上创建的是一个 JDialog,它在表单上有一个关键事件。因此,例如,当按下空间时,它会做一些事情。这一直很好,直到我在同一个对话框上创建了一个可编辑的 JTextArea。当我这样做时,我无法从 JTextArea 中移除焦点并使热键起作用。如何让按键事件和 JTextArea 在同一个 JDialog 上运行?

【问题讨论】:

    标签: java jtextarea keyboard-events jdialog


    【解决方案1】:

    假设您已经为您的 JDialog 对象定义了 KeyListener

    这是获取组件的方法:

    dialog.getContentPane().getComponents();
    

    这是获取KeyListeners 的dialog 数组的方法:

    KeyListener[] keyListeners = dialog.getKeyListeners();
    

    现在,让我们迭代 Components 并添加 KeyListeners:

    Component[] components = dialog.getContentPane().getComponents();
    KeyListener[] keyListeners = dialog.getKeyListeners();
    for (int componentIndex = 0; componentIndex < components.length; componentIndex++) {
        for (int keyListenerIndex = 0; keyListenerIndex < keyListeners.length; keyListenerIndex++) {
            components[componentindex].addKeyListener(keyListeners[keyListenerIndex]);
        }
    }
    

    代码未经测试,如果有任何拼写错误,请告诉我。另外,这不是传递的,也就是说,它不会深入到Components 的Components 的侦听器中,它单独定义了子Components 的关键事件。

    【讨论】:

      【解决方案2】:

      您需要做的是将KeyListenerJDialog 添加到JTextArea

      下面是这个的SSCCE。

      import java.awt.event.*;
      import javax.swing.*;
      
      public class DialogListener {
      
          public static void main(String[] args) {
              JDialog dialog = new JDialog();
              dialog.setSize(300, 400);
              dialog.setVisible(true);
      
              KeyListener listener = getKeyListener();
      
              dialog.addKeyListener(listener);
      
              JTextArea area = new JTextArea();
              area.addKeyListener(listener);
      
              dialog.add(area);
          }
      
          public static KeyListener getKeyListener(){
              return new KeyAdapter() {
                  public void keyTyped(KeyEvent e) {
                      System.out.println(e.getKeyChar());
                  }
              };
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多