java - 如何使光标可以输入 jtextfield 但给它一个文本的唯一方法是单击一个按钮?

标签 java swing jtextfield

我有 jTextfield 和 jButton..

如何

  • 用户可以点击 jTextfield(鼠标可以在 jtextfield 上进入/退出),但是如果用户输入一些东西,它不会做任何事情(除了退格键会删除整个文本)
  • 当用户点击按钮时,它会

jTextfield.setText("something");

所以给 jtextfield 文本的唯一方法是点击按钮

  • 当那里有文本时(当光标在 jtextfield 内时)然后用户键入退格键,它将删除 jtextfield 上的整个文本..

如何做到这一点?

原谅我的英语.. 非常感谢任何形式的帮助..

最佳答案

使用 DocumentFilter ,只需将它添加到您的 JTextField 中,如下所示:

 public class Test {

    public void initComponents() {

        //create frame

        //add DoucmentFilter to JTextField
        MyDocumentFilter myFilter = new MyDocumentFilter();
        JTextField myArea = new JTextField();
        ((AbstractDocument)myArea.getDocument()).setDocumentFilter(myFilter);

         //add components set frame visible
    }

 }

class MyDocumentFilter extends DocumentFilter {

    @Override
    public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
        super.replace(fb, i, i1, string, as);
    }

    @Override
    public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
        super.remove(fb, i, i1);
    }

    @Override
    public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
        super.insertString(fb, i, string, as);
    }

}

或者

您可能想要创建一个 custom JTextField它已经有一个 DocumentFilter(为了可重用性),比如:

public class MyCustomField extends JTextField {

    public MyCustomField(int cols) {
        super(cols);
    }

    protected Document createDefaultModel() {
        return ((Document) new MyDocument());
    }

    static class MyDocument extends DocumentFilter {

        @Override
        public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
            super.insertString(fb, i, string, as);
        }

        @Override
        public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
            super.remove(fb, i, i1);
        }

        @Override
        public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
            super.replace(fb, i, i1, string, as);
        }
    }
}

从气垫船编辑
我更多的是沿着这些思路思考

import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.text.*;

public class Test {

   public void initComponents() {

      JPanel panel = new JPanel();
      final MyDocumentFilter myFilter = new MyDocumentFilter();
      final JTextField myArea = new JTextField(20);
      ((AbstractDocument) myArea.getDocument()).setDocumentFilter(myFilter);

      panel.add(myArea);

      panel.add(new JButton(new AbstractAction("Set Text") {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            myFilter.setFiltering(false);
            myArea.setText("Fe Fi Fo Fum");
            myFilter.setFiltering(true);
         }
      }));

      JOptionPane.showMessageDialog(null, panel);

      // add components set frame visible
   }

   public static void main(String[] args) {
      new Test().initComponents();
   }

}

class MyDocumentFilter extends DocumentFilter {
   private boolean filtering = true;

   @Override
   public void replace(FilterBypass fb, int i, int i1, String string,
         AttributeSet as) throws BadLocationException {
      if (!filtering) {
         super.replace(fb, i, i1, string, as);
      }
   }

   @Override
   public void remove(FilterBypass fb, int i, int i1)
         throws BadLocationException {
      int offset = 0;
      int length = fb.getDocument().getLength();
      super.remove(fb, offset, length);
   }

   @Override
   public void insertString(FilterBypass fb, int i, String string,
         AttributeSet as) throws BadLocationException {
      if (!filtering) {
         super.insertString(fb, i, string, as);         
      }
   }

   public void setFiltering(boolean filtering) {
      this.filtering = filtering;
   }

}

关于java - 如何使光标可以输入 jtextfield 但给它一个文本的唯一方法是单击一个按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13517057/

相关文章:

java - 如何使用我自己的服务器在 Android 应用程序中设置 cloudboost?

java - 将两个整数保存为一个

java - 创建 Bean 时出错 - Autowiring 依赖项失败

java - 将 JSpinner 值转换为新的 int

java - 如何在swing中将元素添加到JList?

Java 监听器不工作,除非我按 Enter 键,如何在文本框更改后使其工作

java - 将 onclick 设置为 listview/json 时出错

java - 如何在Java中构建类似QGraphicsView的组件

java - GridLayout 中的文本字段宽度不会改变

java - 有没有办法只接受 JTextField 中的数值?