【问题标题】:One Key Listener for a lot of JTextField大量 JTextField 的一键监听器
【发布时间】:2014-11-22 16:06:48
【问题描述】:

我的英语很差,所以我在 Google 上找不到任何东西,我有一个 JFrame 和一个 JPanel,其中包含很多 JTextField。当我创建“保存文件”功能时,我必须为每个JTextField 放置一个KeyListener。有没有更有效的方法?

EDIT:是为了测试自上次保存后是否有任何字段被修改

【问题讨论】:

  • 为什么需要 JTextField 上的 KeyListener 来保存文件?我猜你有一个触发事件的按钮,这就是你所需要的。
  • 您几乎不应该将 KeyListener 添加到诸如 JTextField 之类的文本组件中。可能有更好的方法来做到这一点,例如使用键绑定。事实上,这是一个潜在的解决方案。你想诱捕什么按键?
  • "EDIT: is to test if any of the fields have been modified since last save" -- 在这种情况下,使用 DocumentListener。
  • @Dici 是的,但它是为了测试自上次保存后是否有任何字段被修改

标签: java swing jtextfield keylistener documentlistener


【解决方案1】:

关于,

EDIT:是为了测试自上次保存后是否有任何字段被修改

然后使用 DocumentListener。通过这种方式,您可以监听按键以外发生的变化,例如剪切和粘贴,并且仍然做出相同的响应。

你问:

这看起来很酷,但是有没有办法将它添加到 JPanel 或者我需要将它添加到所有字段?

您需要将侦听器添加到每个字段的 Document 中,但如果您将字段放在列表或数组中,使用简单的 for 循环就可以轻松完成。例如运行以下代码。每当按下保存按钮,或者按下 alt-s 激活它时,它就会被禁用。对任何 JTextField 保存的文档进行任何更改都会自动启用它。

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class DocListenerEg extends JPanel {
   private static final int FIELD_COUNT = 10;
   private static final int COLUMNS = 8;
   private JButton saveButton = new JButton(new SaveAction("Save", KeyEvent.VK_S));
   private List<JTextField> fieldList = new ArrayList<>();

   public DocListenerEg() {
      MyDocListener docListener = new MyDocListener();
      add(saveButton);
      for (int i = 0; i < FIELD_COUNT; i++) {
         JTextField field = new JTextField(COLUMNS);
         add(field);
         fieldList.add(field);

         field.getDocument().addDocumentListener(docListener);
      }
   }

   public void documentChange() {
      saveButton.setEnabled(true);
   }

   private class MyDocListener implements DocumentListener {
      private boolean changed = false;

      @Override
      public void changedUpdate(DocumentEvent dEvt) {
         documentChange();
      }

      @Override
      public void insertUpdate(DocumentEvent dEvt) {
         documentChange();
      }

      @Override
      public void removeUpdate(DocumentEvent dEvt) {
         documentChange();
      }

   }

   private class SaveAction extends AbstractAction {

      public SaveAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         // TODO: save the data
         ((AbstractButton) evt.getSource()).setEnabled(false);
      }

   }

   private static void createAndShowGui() {
      DocListenerEg mainPanel = new DocListenerEg();

      JFrame frame = new JFrame("DocListenerEg");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

【讨论】:

  • 这看起来很酷,但是有没有办法将它添加到 JPanel 或者我需要将它添加到所有字段?
猜你喜欢
  • 2015-05-12
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2016-07-16
相关资源
最近更新 更多