JTextField in which the predefined text in not editable but other text can be appended to it?

后端 未结 5 905
一个人的身影
一个人的身影 2020-12-11 17:58

While going through Java swing I faced this problem. I have a JTextField which has predefined and not editable text. the user should be able to append other text to it but w

5条回答
  •  有刺的猬
    2020-12-11 18:51

    You can simply use a DocumentFilter:

    import java.awt.FlowLayout;
    
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.text.AbstractDocument;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
    
    public class TestDocumentFilter {
    
        private static final String TEXT_NOT_TO_TOUCH = "You can't touch this!";
    
        private void initUI() {
            JFrame frame = new JFrame(TestDocumentFilter.class.getSimpleName());
            frame.setLayout(new FlowLayout());
            final JTextField textfield = new JTextField(50);
            textfield.setText(TEXT_NOT_TO_TOUCH);
            ((AbstractDocument) textfield.getDocument()).setDocumentFilter(new DocumentFilter() {
                @Override
                public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
                    if (offset < TEXT_NOT_TO_TOUCH.length()) {
                        return;
                    }
                    super.insertString(fb, offset, string, attr);
                }
    
                @Override
                public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                    if (offset < TEXT_NOT_TO_TOUCH.length()) {
                        length = Math.max(0, length - TEXT_NOT_TO_TOUCH.length());
                        offset = TEXT_NOT_TO_TOUCH.length();
                    }
                    super.replace(fb, offset, length, text, attrs);
                }
    
                @Override
                public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
                    if (offset < TEXT_NOT_TO_TOUCH.length()) {
                        length = Math.max(0, length + offset - TEXT_NOT_TO_TOUCH.length());
                        offset = TEXT_NOT_TO_TOUCH.length();
                    }
                    if (length > 0) {
                        super.remove(fb, offset, length);
                    }
                }
            });
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(textfield);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new TestDocumentFilter().initUI();
                }
            });
        }
    
    }
    

提交回复
热议问题